Как использовать кавычки и кавычки, чтобы более точно перевести Разумного Схемера в Ракетку?

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

0 ответов

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

Другие вопросы по тегам