2013-06-05 2 views
4

Я пытаюсь пройти «Маленький Лиспер» и уже сталкиваюсь с корягами в первой главе. Я относительно новичок в Emacs (что подпитывало мой интерес к изучению Lisp и clojure). Я загрузил приложение Mit-schem, и я работаю над упражнениями на Эдвине.Почему я получаю несвязанную ошибку для «атома»?

Пытаюсь:

(atom? (cons a l)) 

где находится атом и л список уже определен. Я получаю следующую ошибку:

;Unbound variable: atom? 

Почему? У меня нет проблем с использованием «null»? функция. Я подумал «атом»? это внутренняя функция, проверяющая, является ли возвращаемое значение атомом.

Любые объяснения были бы очень признательны. Я все еще не настроил emacs для запуска схемы, и незначительные различия между всеми диалектами Lisp - это испытание моего терпения.

+6

Схемы и Лиспы не совпадают, а схема не имеет предиката 'atom? '. Однако вы можете легко реализовать свои собственные: http://stackoverflow.com/questions/5404707/check-if-an-argument-is-a-list-or-an-atom –

+0

Я видел эту нить, но я думаю, что я не понял его правильно. Я понимаю, что моя ошибка в том, что я пытаюсь работать с этими упражнениями в «Эдвине», который работает в режиме схемы. Можете ли вы рассказать мне о любом другом приложении, где я могу попробовать и использовать примеры для «Маленького Лиспера»? Должен ли я попробовать sbcl на emacs?Все еще работаю над тем, где define/defun/defn подходит :-) – Tavore

+1

Вы можете попробовать [clisp] (http://www.clisp.org/), но вы также можете переключиться на схему. Доступен полный текст классической [Структура и интерпретация компьютерных программ] (http://mitpress.mit.edu/sicp/). –

ответ

3

В "The Little Schemer" ("The Little Lisper" 's обновленный вариант) процедура atom? определяется следующим образом (поскольку atom? не существует на схеме):

(define (atom? x) 
    (and (not (null? x)) 
     (not (pair? x)))) 

Если вы следуя старой версии книги, я советую вам либо искать новую версию, либо использовать тот же язык программирования, который используется в книге: Common Lisp для Little Lisper, Scheme для The Little Schemer - и Racket - отличная среда IDE для схемы работайте с! взгляните на это answer на несколько советов при прохождении через Little Schemer с помощью Racket.

+1

У меня есть PDF третьего издания. Моя ошибка проходила через предисловие, в котором четко указывалось, что необходимо определить функцию атома. Кроме того, я усугубил эту ошибку, пытаясь запустить команды Lisp в редакторе Scheme и не полностью осмысливая различия между ними. Я буду придерживаться SBCL с Emacs. – Tavore

+1

@Tavore, я бы не использовал SBCL с Little Lisper. Маленький Лиспер использовал Scheme, а не Common Lisp, даже когда он назывался «Маленький Лиспер», а не «The Little Schemer». (И как вы нашли, он определяет «атом?» В предисловии.) Сноски говорят вам, как делать то же самое в CL, но проще использовать Scheme - особенно если вы попадете в более поздний материал на Y комбинатор. – Mars

2

I'm trying to go through "The Little Lisper"... I downloaded the Mit-scheme

Common Lisp и Scheme являются очень разными языками.

Вы должны либо использовать другую книгу (например, SICP), чтобы соответствовать вашему реализации языка или другого языка реализации (например, clisp или sbcl), чтобы соответствовать вашей книги.

+0

У меня есть SICP. Я планировал пройти его после того, как закончил Маленький Лиспер. У меня также есть Маленький Schemer, который я еще должен прочитать. Я накапливал книги и путался между ними. Благодарю. – Tavore

+0

SICP и Little Lisper/Schemer имеют очень разные затраты и выгоды. Переход через TLL/S до SICP может быть очень хорошей идеей. – Mars

1

Посмотрите на спецификацию Scheme R5RS; он включает список функций и синтаксических ключевых слов. Хотя эта схема не входит в стандарт Схемы, мит-схема имеет функцию apropos, которая найдет функции (другие вещи) с заданным именем. попробуйте:

(apropos "atom") 

(но ничего не будет показывать :-).

Атом - это нечто, что не является «ячейкой cons» (как правило, если я помню свой CommonLisp). На схеме можно реализовать один, как:

(define (atom? thing) (not (pair? thing))) 

Примечание: это определение atom? согласуется с CommonLisp atom.

+0

Спасибо. Я попробую это. – Tavore