gpt4 book ai didi

scheme - miniKanren:如何定义#s和#u?

转载 作者:行者123 更新时间:2023-12-01 12:05:48 25 4
gpt4 key购买 nike

在迷你看人,succeed可以定义为(define succeed (== #t #t)) , 和 fail可以定义为(define fail (=== #t #f)) .但是 #s 呢?和 #u succeed 的缩写形式和 fail ,就像他们出现在 The Reasoned Schemer 中一样?(define #s succeed)在 Racket 中产生错误:

Welcome to Racket v7.2.
> (require Racket-miniKanren/miniKanren/mk)
> (define #s succeed)
; readline-input:2:8: read-syntax: expected `(`, `[`, or `{` after `#s` [,bt
; for context]
#<procedure:...iniKanren/mk.rkt:337:4>
; readline-input:2:18: read-syntax: unexpected `)` [,bt for context]
我觉得这与阅读器宏有关。
如何定义 #s对于 succeed#u对于 fail在计划和 Racket 中?
我正在使用 canonical miniKanren implementation for Schemecanonical miniKanren implementation for Racket .

最佳答案

Racket 中的标识符不能以 # 开头.绑定(bind)标识符很简单 su .重新定义#s的含义和 #u不是那么简单,因为它需要发生在读者身上。通常 #something向读者发出信号,表明要阅读一些特别的东西。
输入 (foo bar)将被读取为列表,#(foo bar)将被读取为向量,并且 #s(foo bar)将被读取为结构。您可以在此处阅读有关标准语法的信息:

https://docs.racket-lang.org/reference/reader.html?q=%23s#%28mod-path._reader%29

现在如果你想改变#s的意思和 #u您需要查看可读表。
每次读者看到 #它查阅一个可读表以了解如何处理以下字符。由于读取发生在解析/扩展和评估之前,您不能简单地通过调用程序中的函数来更改读取器。您将需要使用#reader扩展机制或创建自己的语言。

有关 readtables 的更多信息:https://docs.racket-lang.org/reference/readtables.html?q=reader-macro

该指南有一个如何使用阅读器扩展的示例:
https://docs.racket-lang.org/guide/hash-reader.html

关于scheme - miniKanren:如何定义#s和#u?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57133822/

25 4 0