В настоящее время я играю с LISP. Все хорошо, но я не могу понять следующий вопрос.
У меня есть эта операция добавления:
(define (append l1 l2)
(if (eq? l1 null)
l2
(cons (first l1)
(myappend (rest l1) l2))))
Я использую это так:
(myappend (cons (cons 1 2) null) '(4 5))
И результат в Racket:
'((1 . 2) 4 5)
Но почему? По моему мнению, это должно быть '(1 2 4 5), потому что cons возвращает список, а myappends добавляет два списка. Кто-нибудь может мне помочь? Что делает ЛИСП?
nil
. В стандартной схеме (которой Racket, очевидно, является диалектом) списки не заканчиваются символом. Они заканчиваются пустым объектом списка, который записывается как()
(и который должен быть заключен в кавычки при использовании в качестве выражения:'()
). В Scheme вы используете(null? x)
, чтобы проверить, является лиx
пустым списком, а не(eq x null)
; нет предопределенногоnull
. В Common Lisp это(null x)
или(not x)
или(eq x nil)
. - person Kaz   schedule 09.04.2012