如何使用 quote 和 unquote 更忠实地将 The Reasoned Schemer 翻译成 Racket?
How to use quote and unquote to more faithfully translate The Reasoned Schemer into Racket?
(Racket 设置中我的 miniKanren 的详细信息显示在底部[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))
。
这似乎是一个小问题,但在许多情况下,所需的 t运行slation 非常冗长。例如,在第 3 章(第 34 页)的练习 45 中,本书大致[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] 如here所述,我运行 raco pkg install minikanren
然后定义了一些缺失的部分。
[2] 事实上,他们并没有准确地这样写,但是如果你听从那节经文和更早的经文脚注中的建议,你就会得到。
[3] 取模一些我无法推断的隐式引用和取消引用。
使用反引号 `
代替您一直使用的简单引号 '
。
(Racket 设置中我的 miniKanren 的详细信息显示在底部[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))
。
这似乎是一个小问题,但在许多情况下,所需的 t运行slation 非常冗长。例如,在第 3 章(第 34 页)的练习 45 中,本书大致[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] 如here所述,我运行 raco pkg install minikanren
然后定义了一些缺失的部分。
[2] 事实上,他们并没有准确地这样写,但是如果你听从那节经文和更早的经文脚注中的建议,你就会得到。
[3] 取模一些我无法推断的隐式引用和取消引用。
使用反引号 `
代替您一直使用的简单引号 '
。