Как использовать кавычки и без кавычек, чтобы более точно перевести The Reasoned Schemer на Racket?

(Подробности настройки моего 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] По модулю некоторых неявных кавычек и раскатываний, которые я не могу вывести.


person Jeffrey Benjamin Brown    schedule 16.11.2018    source источник
comment
Похоже, вам следует использовать quasiquote вместо quote.   -  person user4003407    schedule 16.11.2018
comment
квазицитата пишется с обратной кавычкой ( `` ` `` ), которая находится на той же клавише, что и тильда (~), а не обычная галочка (')   -  person Alex Knauth    schedule 16.11.2018
comment
В этом была проблема. Спасибо!   -  person Jeffrey Benjamin Brown    schedule 16.11.2018
comment
Также обратите внимание, что (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.2018
comment
@PetSerAl Если z - правильный список, это правда. Однако в этом разделе книги рассматриваются проблемы, связанные с неправильными списками.   -  person Jeffrey Benjamin Brown    schedule 17.11.2018
comment
@JeffreyBenjaminBrown Можете ли вы показать пример, когда это не так? Предполагая, что cons и 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
comment
@PetSerAl Рассмотрим более простой пример: (list 1 3) = (1 3), а (cons 1 3) = (1 . 3). Первый — это правильный список, cdr которого равен (3). Второй — неправильный список; его cdr 3 вместо (3).   -  person Jeffrey Benjamin Brown    schedule 17.11.2018
comment
@JeffreyBenjaminBrown (list 1 3) это (1 3), а (list* 1 3) это (1 . 3).   -  person user4003407    schedule 17.11.2018
comment
Спасибо! Виноват. Я не знал о list* и прочитал его как list.   -  person Jeffrey Benjamin Brown    schedule 17.11.2018


Ответы (1)


Используйте обратную кавычку ` вместо простой кавычки ', которую вы использовали раньше.

person Will Ness    schedule 03.12.2018