Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Функция, возвращающая форму своего определения 
:(
    Опции темы
Tymvie
Дата 25.5.2011, 11:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 5.9.2010

Репутация: нет
Всего: нет



Здравствуйте
Помогите разобраться в задаче

Задание: определить функцию, возвращающую в качестве своего значения форму своего определения (DEFUN).
Решение из книги "Мир Лиспа":
Код

(defun self nil(

 (lambda (x)(list 'defun 'self nil(list x (list 'quote x))))

'(lambda (x)(list 'defun 'self nil(list x (list 'quote x))))))

PM MAIL   Вверх
NuINu
Дата 26.5.2011, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 131
Регистрация: 19.7.2008

Репутация: нет
Всего: 6



Код

#!/usr/bin/clisp

;; попытка разобраться как работает печатающая сама себя функция
(defun selfbase nil
    (
    (lambda (x)(list 'defun 'self nil(list  x (list 'quote x))))
    '(lambda (x)(list 'defun 'self nil(list x (list 'quote x))))
    )
)


;;назначение второй строки '(lambda это быть скопированным в результирущий список столько раз сколько x стоит в первой строке
;;при этом если в первой стоке стоит (list 'quote x) то добавляемая 2я стока в результирующий спискок
;;имеет перед собой апостроф можно просто поменять местами их 'self nil(list (list 'quote x) x)) и квотирование поменяется 
;;но в реальном то коде надо как раз квотировать 2ю строку, именно она
;;является стокой а не кодом, ну а первая строка так же возвращает список в начале которого стоят элементы: 'defun 'a1 nil
;;и первой же стоке в качестве параметра передается вторая стока которая и вставляется в позиции переменной x
;;таким образом в результирующем списке появляются две строки(а можно добавить и больше) как и в исходном коде функции. после чего данный список возвращается.
;;базируясь на этих рассуждениях я написал функцию self3

(defun a2 nil
    "from a2"
)

(defun a1 nil
    "from a1"
)


(defun self nil
    (
    (lambda (x)(list 'defun 'a1 nil(list x (list 'quote x) )))
    '(lambda (x)(list 'defun 'a2 nil(list "result1" (list 'quote result2))))
    )
)


(defun self3 nil
    (
     (lambda (x y)(list 'defun 'self3 nil(list x (list 'quote x) (list 'quote y))))
    '(lambda (x y)(list 'defun 'self3 nil(list x (list 'quote x) (list 'quote y))))
    '(lambda (x y)(list 'defun 'self3 nil(list x (list 'quote x) (list 'quote y))))
    )
)

(defun self3x nil
    (
     (lambda (x y)(list 'defun 'self3x nil(list x (list 'quote x) (list 'quote x))))
    '(lambda (x y)(list 'defun 'self3x nil(list x (list 'quote x) (list 'quote x))))
    '(lambda (x y)(list 'defun 'self3x nil(list x (list 'quote x) (list 'quote x))))
    )
)


;;'(lambda (x)(list 'defun 'self nil(list x (list 'quote x))))


(defun main()
  ;;(trace self lambda list defun a2 a1 )
  (format t "self function: |~s|~%" (self))
  ;;(untrace self lambda list defun a2 a1 )
  ;;(format t "selfbase function: |~s|~%" (selfbase))
  (format t "self3 function: |~s|~%" (self3))
  (format t "self3x function: |~s|~%" (self3x))
)

(main)


пояснения в коде
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.0458 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.