Функция печати lisp для чтения - PullRequest
8 голосов
/ 01 марта 2011

Я пробую lisp и работаю с книгой Practical Common Lisp в http://www.gigamonkeys.com/book/.

. Есть ли команда, которая может напечатать функцию, которая была ранее определена в REPL, способом, который позже может бытьчитать?Я пробовал

(print #'function-name)

, но это приводит к выводу, заключенному в #<>, который не может быть считан обратно (и если <code>*print-readably* установлен на T, я просто получаюошибка).Я получаю те же результаты, используя princ или prin1 вместо print.

Я немного удивлен, что это не так легко найти.Несколько вещей, которые я прочитал на lisp, поощряют эксперименты в REPL, но если вы не можете сохранить свои функции после их ввода, вы вынуждены записать их в отдельный файл перед вводом, что отчасти побеждаетточка.

Ответы [ 4 ]

12 голосов
/ 01 марта 2011

Объекты функций не могут быть прочитаны обратно.

1) Вы можете использовать функцию DRIBBLE, которая заставляет вход REPL быть сохраненным в файл.

2) Распространена оценка из редактора в REPL. Вам не нужно вводить в REPL, вы можете ввести в текстовый буфер редактора и отправить выражения оттуда в REPL.

3) Common Lisp имеет FUNCTION-LAMBDA-EXPRESSION, которая при некоторых обстоятельствах может восстановить исходный код (или то, что система Lisp записала в качестве источника):

CL-USER 200 > (defun foo (a) (+ a b))
FOO

CL-USER 201 > (function-lambda-expression #'foo)
(LAMBDA (A) (DECLARE (SYSTEM::SOURCE-LEVEL #<EQ Hash Table{0} 41C00751D3>))
  (DECLARE (LAMBDA-NAME FOO))
  (+ A B))
NIL
FOO
3 голосов
/ 01 марта 2011

Короче говоря, нет, это не так, наоборот, очень просто - их очень легко записать в файл и отправить в реплан с помощью emacs & slime.

По умолчанию iirc C-x e оценивает форму непосредственно перед точкой (курсором emacs) в ответе.

Это дает вам лучшее из обоих миров - согласованность файлов и интерактивность реплея.

Удачи в путешествии!

1 голос
/ 24 декабря 2011

Я бы порекомендовал вам использовать emacs.Загрузите красивую функцию принтера.Пакет (цитата пп).Просто по поводу симпатичного принтера.Slime также делает красивую печать функций (если я правильно помню), но пакет с emacs хорош.

(требуется 'pp)

Я написал оператор формата, который использовал для печатианонимные (или именованные) функции, но код находится на другом компьютере.Если вам интересно, дайте мне знать, и я постараюсь найти его.

[...]

да, вы можете найти и напечатать функции, набранные в REPL позже,просто проверьте пространство имен для имени функции.Думайте о пространстве имен как о хеш-таблице.Если функция была интернирована, она должна появиться в пространстве имен.Я думаю, что есть способ сказать, maphash пространство имен ...

Некоторые реализации lisp требуют, чтобы вы установили переменную, чтобы код функции оставался прикрепленным к символу функции;это похоже на отладочные символы в с.Это занимает место, но отладка автоматически сгенерированных функций - это сука с подбрасыванием в некоторых расширениях макроса-1 ...

Попробуйте использовать команды,, ... и я рисую пробел.Прошло много времени.Обычно самой большой проблемой является исправление неназванных функций (лямбда-выражения).Некоторые реализации также реализуют «именованную анонимную функцию» или что-то в этом роде.

<Существует ли команда, которая может напечатать функцию, которая ранее была определена в REPL, <способом, который впоследствии можно будет прочитать? </p>

Действительно хороший вопрос.Да, ты можешь.Это может быть так же просто, как write-fasl-stream или что-то более сложное.

0 голосов
/ 01 марта 2011

Функции скомпилированы, и их исходный код никогда не сохраняется. Я бы порекомендовал использовать Emacs + Slime, там легко просмотреть историю.

...