(Подробности настройки моего 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] По модулю некоторых неявных кавычек и раскатываний, которые я не могу вывести.
quasiquote
вместоquote
. - person user4003407   schedule 16.11.2018~
), а не обычная галочка ('
) - person Alex Knauth   schedule 16.11.2018(cons '(g g) (cons (list 'e w) (cons (list x y) z)))
можно записать как(list* '(g g) (list 'e w) (list x y) z)
. - person user4003407   schedule 17.11.2018cons
иlist*
имеют свои нормальные определения, AFAIK,(list* a b c d e)
должно быть таким же, как(cons a (cons b (cons c (cons d e))))
. ideone.com/rxqmB5 - person user4003407   schedule 17.11.2018(list 1 3)
=(1 3)
, а(cons 1 3)
=(1 . 3)
. Первый — это правильный список, cdr которого равен(3)
. Второй — неправильный список; его cdr3
вместо(3)
. - person Jeffrey Benjamin Brown   schedule 17.11.2018(list 1 3)
это(1 3)
, а(list* 1 3)
это(1 . 3)
. - person user4003407   schedule 17.11.2018list*
и прочитал его какlist
. - person Jeffrey Benjamin Brown   schedule 17.11.2018