Тема: Самомодифицирующийся лисп
Подскажите пожалуйста есть ли в инете инфа по механизмам (принципам) организации самомодифицирующихся лиспов?
И еще: нет ли данной темы среди рассмотреных Н.Н.Полещуком
Информационный портал для профессионалов в области САПР
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форумы CADUser → Программирование → LISP → Самомодифицирующийся лисп
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Подскажите пожалуйста есть ли в инете инфа по механизмам (принципам) организации самомодифицирующихся лиспов?
И еще: нет ли данной темы среди рассмотреных Н.Н.Полещуком
Неужели никто не пробовал что-то подобное делать? Ведь это если я правильно понимаю мощнейший механизм. Хотя бы печальным опытом поделитесь.
> Random
1. Формируйте динамически LSP-файл и загружайте его.
2. Кроме того есть функция defun-q, создающая пользовательские функции с изменяемым телом (пример в книге есть).
Механизм действительно очень мощный, возможно именно из-за этого, редко удается найти применение на практике... Тут ведь скорее дело не в принципах - они предельно просты (с точки зрения Лиспа), а в том чтобы сформулировать нужным образом задачу... Немного затрагивается эта тема в двухтомнике "Мир Лиспа", но там чуть-чуть, а подробнее нигде встречать не приходилось...
Есть такая функция (read), она позволяет ни много, ни мало, а проинтерпретировать строку текста (составленную по определённым правилам, которые можно найти в Хелпе или в книге Н.Н.Полещука) в Лисповский код !!! На практике мне это понадобилось, когда я делал однотипные ф-ии для доступа к неким переменным. Функции отличались только именами этих самых переменных, но ведь это различие на уровне исходного кода, поэтому всякие Бейсики-Паскали отдыхают. Фактически, я реализовал "методы", а при желании мог бы реализовать свой язык программирования.
А вопрос-то очень интересный. Сколько кручусь вокруг этого дела (с 88), столько слышу про это одно из преимуществ LISP перед другими языками (подчеркиваю - без кавычек). Самомодифицирующийся код, искусственный интеллект и т. д. и т. п. Но как только доходит до конкретики: "Вот Вы работаете в такой-то области. Как часто Вы сие используете, и используете ли вообще?" В ответ, как правило, полная тишина. Или
Механизм действительно очень мощный, возможно именно из-за этого, редко удается найти применение на практике...
Фактически, я реализовал "методы", а при желании мог бы реализовать свой язык программирования.
Ладно мы, сирие и убогие, но что-то я и у разработчиков (имею в виду Autodesk) ничего похожего не наблюдаю. Если есть потенциальная возможность, но она не используется (практически) - значит ее нет. Как говаривали классики: "Практика - критерий истинности."
> bender
Думаю Вы излишне категоричны, если я не видел электрона это еще не говорит о том что он существует, так же и данном случае - да эта возможность, насколько мне известно,используется довольно редко, но здесь скорее все же виноваты стереотипы и недостаки интеллекта (естественного), кроме того, для большинства задач, применение подобного метода выглядело бы как забивание гвоздей микроскопом (сори за набившее оскомину сравнение)
> Сергей Попадьин
для большинства задач, применение подобного метода выглядело бы как забивание гвоздей микроскопом (сори за набившее оскомину сравнение)
Так ведь и я о том же.
Надо смотреть немного шире, в смысле не только на AutoLISP. А где еще кроме разработок "искуственного интеллекта" были пременены самомодифицирующиеся программы на LISP? Наверняка есть такие задачи где применение таких алгоритмов оправдано. Но посмотрите на форум, много ли сдесь программ с использованием математики выходящей за рамки обычной арифметики и школьной алгебры?
И главные вопрос. Что практически означает "самомодификация"? Если она контролируема, то впринципе может быть заменена обычными условиями. А если неконтролируема... Ну это уже типа теории нейронных сетей:) Дам адресок где такие проблеммы обсуждаются www.membrana.ru
Fantomas прав.
Нет таких особых задач в AutoCAD. Все можно сделать более простыми методами. Пожалуй типичный пример самомодифицирующейся функции -
(setq S::STARTUP (append S::STARTUP my_startup))
где my_startup должна быть объявлена через defun-q
(defun-q my_startup () (что_то_делание) )
В этом примере вежливый программист не переопределяет функцию S::STARTUP, которая может использоваться и иными загруженными программами, а добавляет свой код в виде списка. В коде могут быть и данные. Что в S::STARTUP было до - неизвестно, что еще будет потом кем-то добавлено - тоже неизвестно.
Пример очень простой и не совсем про "самомодификацию", но где-то близко.
И что такое "самомодификация"? Изменение текста? Не очень-то и надо. Изменение алгоритма работы или данных? Так это в LISP происходит всегда, когда на верхний уровень передаются, без переменных результаты вложенных функций.
И применение LISP не ограничивается AutoCAD и кругом его довольно примитивных задач (нарисовать, отредактировать, написать).
Добавлю 5 копеек.
Само- и не само- модификация исполняемого кода актуальна для случаев, когда программа _длительное_ время находится в режиме выполнения (возможно, резидент) и при этом должна адаптироваться к ситуации, которая изменяется заренее непредсказуемым образом, по неким, заранее определённым правилам. Т.е., программист должен описать "физику" некого "мира", в котором "живёт" программа. На заре своего лиспописательста, я пробовал экспериментировать с этим механизмом, но, в итоге, пришёл к точке зрения, очень близкой к "микроскопной". По сути, единственный случай, когда в Autocad'е может быть обосновано применение механизма интелектуальной модификации (то, что описал > ShaggyDoc (2004-08-13 09:47:21) - модификация конечно, но, как он верно заметил, немного другого типа), это работа с реакторами, но там и без этого граблей хватает... Кроме того, моей квалификации в математике оказалось явно недостаточно для уверенного управления этими процессами, а время, которое нужно потратить на создание устойчивой ИИ системы совершенно неадекватно моим задачам.
> bender
а мне показалось, что Вы утверждали несколько иное:
Если есть потенциальная возможность, но она не используется (практически) - значит ее нет.
, мне не кажется что я утверждаю нечто похожее - как уже неоднократно подчеркивалось, просто нет, как правило, подходящих задач.
Это главная, но не единственная причина... есть еще и стереотипы - подавляющее большинство знакомится с Лиспом уже будучи знакомым с каким-нибудь другим языком (обычным) программирования, и далеко не всем легко удается сразу перестроиться на функциональный стиль программирования, большинство продлолжают использовать Лисп как бейсик со скобками... :( , рекурсия, функционалы и т.п. - для многих остаются чем-то ужастно страшным, не говоря уже о самомодификации...
Самомодифицирующийся код - очень удобная вещь для создания функций с переменным числом аргументов. Правда есть сомнения в актуальности сих функций. Гораздо удобнее группировать аргументы в список и уже потом с ним разбираться.
СОгласен насчет группировки параметров - это самый короткий путь.
А под механизм самомодификации у меня и задач то конкретных нет. Просто интересно стало что это за зверь такой. Тем более что периодически появляется свободное время и есть возможность с этой темой разобраться.
Fantomas (2004-08-13 02:38:47)
Спасибо за интересную сцылу.
;;; SELF-MOD.LSP
;;; example for self-modifying code within AutoLISP
;;; works only with simple lisps which store functions as lambda lists
;;;
;;; (c) 1996 Reini Urban
;;; Permission to use, copy, modify, and distribute this software
;;; for any purpose and without fee is hereby granted, provided
;;; that the above copyright notice appears in all copies and that
;;; both that copyright notice and this permission notice appear in
;;; all supporting documentation.
;;; This is the normal recursive definition of the factorial
;;; its simple but inefficient, because it doesn't store intermediate results (fact-simple 3)
(defun fact-simple (n)
(cond ((zerop n ) 1)
(T (* n (fact-simple (1- n))))))
;;; therefore we cache previously calculated results in the function itself
;;;
;;; (fact 1) -> 1
;;; creates:
;;; (defun fact (n)
;;; (cond ((zerop n) 1)
;;; ((= n 1) 1)
;;; (T .. (* n (fact (1- n))))))
;;;
;;; (fact 4) -> 24
;;; creates:
;;; (defun fact (n)
;;; (cond ((zerop n) 1)
;;; ((= n 1) 1)
;;; ((= n 4) 24)
;;; (T .. (* n (fact (1- n))))))
;;;
;;; fact: ((n) (cond ((zerop n) 1) .. (T .. (* n (fac (1- n)))))))
;;; car cadr cdadr (last (cdadr fact))
;;; (fact 0)
(defun-q fact (n / old result)
(setq n 5)
(cond ((zerop n) 1)
(T
(setq old fact)
(setq fact (list '(n)
(cons 'cond
(append (butlast (cdadr old))
(list (list (list '= 'n n)
(setq result (* n (fact (1- n))))))
(list (last (cdadr old)))))
))
result
)
)
)
;;; helper functions for list manipulation
;;; list without the last (butlast '(0 1 2 3))
(defun butlast (lst)
(head lst (- (length lst) 2)))
;;; all elements until the including (nth n lst),
;;; (head '(0 1 2 3) 2) -> '(0 1 2)
(defun head (lst n)
(if (not (minusp n))
(cons (car lst) (head (cdr lst) (1- n)))))
Браво Reini Urban - подобная реализация кеширования и в самом деле очень неплохой вариант... вот что значит уйти от стереотипа!!!
Уфффф....
Тока после того как в лиспе отформатил - разобрался.
Круто ничего не скажешь.
Честно говоря, так и не смог понять - что в примере Reini Urban'а так всех впечатляет. Разве что вычурность, причём достаточно непонятная (он сам себя и запутал - не сумел сохранить промежуточные результаты) - существенно лучший результат можно получить если не использовать самомодификацию (хоть бы так (написано за 10 минут)):
(defun sfact (n / res) (cond ((zerop n) 1) ((setq res (assoc n *sfact*)) (cdr res)) (t (setq res (* n (sfact (1- n))) *sfact* (cons (cons n res) *sfact*) ) ;_ end of setq res ) ) ;_ end of cond ) ;_ end of defun
То, что у меня используется глобальная переменная, в данном случае не минус, поскольку суммарное количество глобальных имён даже меньше - 2 против 3-х.
Так что, я не стал бы использовать такой пример, как аргумент в пользу самомодификации - он, скорее, дискредитирует эту идею. Какое уж тут "браво" -> отстой... :(
imho
Поправка.
вторая строка кода должна быть такой:
(cond ((zerop n) 1.0)
иначе результат будет целочисленным с ограничением размера.
На сайте Reini Urban можно найти много шедевров. Но практического применения большинство из них не находит. Это как бы "высокая мода", которой все дамы восхищаются, но носить такое никогда не будут.
Может кто-нибудь сказать, какое практическое применение в САПР у столь любимой преподавателями функции вычисления факториала? Это стандартный учебный пример для демонстрации разных приемов - итерация, рекурсия, теперь вот "самомодификация".
Библиотеки Reini Urban академичны. Я до молекул разбирал его StdLIB и нашел совсем немного того, что можно применить в практических целях. Отдельные кусочки очень оригинального и отдельные типовые функции, написанные лучше, чем их обычно делают другие, в том числе и я. Поучиться, как писать - да. Очень полезно. Хотя и у него есть ошибки, которые не выявляются из-за малой практики применения.
А вот DOSLib, не блещущая красотой, нужна сразу и всем.
Попробовал сделать самомодифицирующийся LISP для гидравлических расчетов и отказался. Сделать можно, но не нужно. Делать ради демонстрации чистой идеи и уязвления Basic - нет смысла.
> spook
Так ведь браво не за реализацию, а за идею, а то что в тексте пару неточностей это не такая уж и беда - главное демонстрация возможного пути... Я, например, могу честно признаться, что в свое время не смог дойти до подобного решения, хотя и чувствовал что оно где-то рядом, а вот не подумал о самомодификации... так-что именно БРАВО!!!
> ShaggyDoc
Гляньте на код VH:
https://www.caduser.ru/forum/topic6827.html
красивый и изящный!
Вы классный програмист - но не пишите на лиспе, а пишите на лиспе как на басике, ну или как на дельфях, как вам угодно.
Не обижайтесь. Лисп как кроссворд - можно написать примитивно, как на любом языке а можно написать в три-пять строчек - но это прикол понятен и доставляет удовольствие не каждому...
То что пишит Рени, как правило это до сих пор последний или один из последних писков в лиспе.
Лично для меня написать код на чистом лиспе доставляет огромное удовольствие - как правило он занимает времени раз в 5-10-30 больше, чем на лиспе как "на басике". Хотя теплиться надежда, что года через 2-3 это будет занимать у меня столько же времени...
> Умник
Ну и зачем это высказывание? Рени от меня защищать, ссылаясь на код VH? Так я и пишу о нем всегда используя превосходные степени сравнения. Код его библиотек не нуждается в защите. А вот кода прикладных программ, ради которых и делаются библиотеки, не видел. Судить не могу.
...пишите на лиспе как на басике, ну или как на дельфях, как вам угодно..
"Я Пастернака не читал, но тоже...". Почитаете еще. Увидите сотни раз и mapcar и lambda и т.п. Вот самомодифицирующегося LISP (тема этой ветви) - не увидите.
Можете кое-что на сайте уже сейчас. Конечно же, найдется и "как на басике". Потому, что приходится заниматься не "чистым лиспом", ради удовольствия и "последнего писка", а делать быстро и много прикладных программ. И тратить на каждую "времени раз в 5-10-30 больше" не могу.
Этим и отличается "высокая мода" от презренных производственных задач по "одеванию" населения. Турция не Париж.
Мои работы приглашаю обсуждать на www.kurganobl.ru/cad/
> Умник
Ну, ShaggyDoc в посторонней защите не нуждается - качественного лисп-кода (не Лисп - не берусь оценивать) у него столько, сколько у большинства нет просто никакого...
Что касается: То что пишит Рени, как правило это до сих пор последний или один из последних писков в лиспе. - так вот тут, как раз, это немножко сильно не так. Нисколько не ставя под сомнение его квалификацию и способности, как лиспописателя, замечу только, что одним из основных критериев качества товарного кода являются его востребованность и работоспособность. Программирование, как работа, изначально нацелено на решение задач, т.е. если код надёжно решает задачу с приемлемыми затратами времени и ресурсов, то он, как минимум - неплохой. Но код Reini Urban'а, нередко не решает никаких практических задач!... Он сделан для демонстрации каких-либо приёмов (ShaggyDoc - совершенно прав, что код Reini Urban'а академичен - по сути это учебный код), но использовать его напрямую, практически никогда не будет удобно и эффективно.
> spook
"..но использовать его напрямую, практически никогда не будет удобно и эффективно.."
Мэтр не должен нарушать молчание шаблонами, готовыми к использованию, ни к чему ему это... А вот ученик умный примет его высказывание к сведению и проведя небольшую умственную работу придумает "свое".
"Не будь таким квадратным!" по-моему ролик такой на ТВ был!
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форумы CADUser → Программирование → LISP → Самомодифицирующийся лисп
Форум работает на PunBB, при поддержке Informer Technologies, Inc