Как использовать кавычки и кавычки, чтобы более точно перевести Разумного Схемера в Ракетку? - PullRequest
0 голосов
/ 16 ноября 2018

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

1 Ответ

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

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

...