(Подробная информация о моем miniKanren в настройке Racket отображается внизу [1].)
То, как работают кавычки и кавычки в The Reasoned Schemer, похоже, не соответствует тому, как они работают в Racket. Например, стих 2 главы 2 предлагает [2] следующее определение функции:
(run #f
(r )
(fresh (y x )
(== '(,x ,y) r )))
Если я оцениваю это, я получаю '((,x ,y))
. Если вместо этого я переписываю это так:
(run #f
(r )
(fresh (y x )
(== (list x y) r)))
Я получаю ожидаемый результат, '((_.0 _.1))
.
Это может показаться незначительной проблемой, но во многих случаях требуемый перевод очень многословен. Например, в упражнении 45 главы 3 (стр. 34) книга примерно [3] дает следующее определение:
(run 5 (r)
(fresh (w x y z)
(loto (('g 'g) ('e w) (x y) . z))
(== (w (x y) z) r)))
Чтобы получить полученные результаты, мне пришлось переписать это так:
(run 5 (r)
(fresh (w x y z)
(loto (cons '(g g)
(cons (list 'e w)
(cons (list x y)
z))))
(== (list w (list x y) z)
r)))
[1] Как описано здесь , я запустил raco pkg install minikanren
и затем определил несколько пропущенных кусочков.
[2] На самом деле, они не пишут именно это, но если вы прислушаетесь к советам в сносках к этому стиху и к более раннему стиху, это то, что вы получите.
[3] По модулю неявные цитаты и цитаты, которые я не могу вывести.