Каково правильное представление (a (b. C) d) в рамочной записи? - PullRequest
0 голосов
/ 31 декабря 2018

Я делаю упражнения в ANSI Common Lisp Пола Грэма.И у меня был ключ к упражнениям другого человека, а именно:

http://www.shido.info/lisp/pacl2_e.html

После того, как я закончил упражнения для Глава 3 , я имею в виду, чтоключ, чтобы проверить мои ответы по одному.Когда дело доходит до представления (a (b . c) d), я обнаруживаю, что не могу понять ответ Шидо, а именно:

http://www.shido.info/lisp/acl3-1d75.png

Что меня точно озадачило, так это то, что в его ответе dза ним не следует nil.

Так ли правильно его ответ?Что такое правильное представление о (a (b . c) d) на самом деле?

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Вы можете использовать программу sdraw :

(load "sdraw.generic.lisp")

(sdraw '(a (b . c) d))

[*|*]--->[*|*]------->[*|*]--->NIL
 |        |            |
 v        v            v
 A       [*|*]--->C    D
          |
          v
          B

Отсюда видно, что ваша идея верна.

0 голосов
/ 31 декабря 2018

Способ ответить на подобные вопросы - заставить систему ответить на них за вас.К сожалению, чтобы сделать это правильно, требуется понимание того, как работает система печати CL, что не так просто (на самом деле: я забыл, как это сделать правильно!).Но вы можете написать бессмысленную функцию, которая превращает вещи в строки и использует объектную систему для преобразования различных видов вещей в строки подходящим образом.Это не будет работать для объектов, которые не являются conses, но содержат conses, но вполне достаточно для простых целей:

(defgeneric thing->string (thing)
  (:method ((thing t))
   ;; any kind of thing we don't know about gets printed like this
   (format nil "~A" thing))
  (:method ((thing cons))
   ;; conses get printed like this
   (format nil "(~A . ~A)" 
           (thing->string (car thing))
           (thing->string (cdr thing)))))

Now: (thing->string ...) ответит на вашвопрос.

...