【问题标题】:How to use quote and unquote to more faithfully translate The Reasoned Schemer into Racket?如何使用 quote 和 unquote 更忠实地将 The Reasoned Schemer 翻译成 Racket?
【发布时间】:2018-11-16 03:35:35
【问题描述】:

(我的迷你看人在球拍设置中的详细信息显示在底部[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))

这似乎是一个小问题,但在许多情况下,所需的翻译非常冗长。例如,在第 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] 对一些我无法推断的隐式引用和取消引用取模。

【问题讨论】:

  • 看来您应该使用quasiquote 而不是quote
  • 准引号是用反引号 ( ` ` ) 编写的,它与波浪号 (~) 在同一个键上,而不是正常的刻度 (')
  • 还要注意(cons '(g g) (cons (list 'e w) (cons (list x y) z)))可以写成(list* '(g g) (list 'e w) (list x y) z)
  • @JeffreyBenjaminBrown 如果这不是真的,你能举个例子吗?假设conslist* 有它们的正常定义,AFAIK、(list* a b c d e) 应该与(cons a (cons b (cons c (cons d e)))) 相同。 ideone.com/rxqmB5
  • @JeffreyBenjaminBrown (list 1 3)(1 3),但 (list* 1 3)(1 . 3)

标签: scheme racket quote minikanren


【解决方案1】:

使用反引号 ` 而不是您一直使用的简单引号 '

【讨论】:

    猜你喜欢
    • 2013-07-07
    • 2018-04-03
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-11
    • 2014-06-28
    • 2017-02-17
    相关资源
    最近更新 更多