Scheme miniKanren:如何定义s和u?

Scheme miniKanren:如何定义s和u?,scheme,racket,minikanren,reasoned-schemer,Scheme,Racket,Minikanren,Reasoned Schemer,在miniKanren中,succeed可以定义为(define succeed(=#t#t)),fail可以定义为(define fail(=#t#f))。但是#s和#u作为成功和失败的缩写形式,如它们出现在合理的方案中,又如何呢 (定义#s success)在球拍中产生错误: 欢迎来到Racket v7.2。 >(需要球拍迷你卡伦/迷你卡伦/mk) >(定义#s success) ; readline输入:2:8:读取语法:应为“(”、“[”、或“{”在“#s”[,bt之后 ;用于上下文]

在miniKanren中,
succeed
可以定义为
(define succeed(=#t#t))
fail
可以定义为
(define fail(=#t#f))
。但是
#s
#u
作为
成功
失败
的缩写形式,如它们出现在合理的方案中,又如何呢

(定义#s success)
在球拍中产生错误:

欢迎来到Racket v7.2。
>(需要球拍迷你卡伦/迷你卡伦/mk)
>(定义#s success)
; readline输入:2:8:读取语法:应为“(”、“[”、或“{”在“#s”[,bt之后
;用于上下文]
#
;readline输入:2:18:读取语法:意外的“)”[,bt表示上下文]
我觉得这与阅读器宏有关

我如何在Scheme和Racket中为
成功定义
#s
,为
失败定义
#u


我正在使用和。

球拍中的标识符不能以
开头。绑定标识符
s
u
很简单。重新定义
\s
\u
的含义并不是那么简单,因为它需要在读卡器中发生。通常
\something
向读卡器发出信号特别是要阅读。 输入的
(foo-bar)
将作为列表读取,
#(foo-bar)
将作为向量读取,
#s(foo-bar)
将作为结构读取。您可以在此处阅读标准语法:

现在,如果您想更改
#s
#u
的含义,您需要查看readtables。 每次读卡器看到一个
#
时,它都会查阅一个可读表,以了解如何处理以下字符。由于读取是在解析/扩展和求值之前进行的,因此不能仅通过调用程序中的函数来更改读卡器。您需要使用
#reader
扩展机制或创建您自己的语言

有关readtables的详细信息:

本指南提供了一个如何使用读卡器扩展的示例:
我用

(define succeed
  (lambda (s)
    `(,s)))
(define SUCC succeed)

(define fail
  (lambda (s)
    '()))
另一方面,你应该参考Friedman&Byrd提供的。我使用mit方案解决了这个问题——没有使用racket的特定功能,R6R就足够了。

对于racket,
\u
可以这样定义(参考:):

请注意,这仅适用于REPL

这通过修改来定义
#s
#u


对于Scheme,中定义了添加读取语法,但生成的
#,()
表单对于大多数人来说可能都很尴尬。对于Scheme来说,最好只定义
s
u
,因为目前还没有可移植的方法来定义
\s
\u

简单的答案可能是,这并不重要,因为它可能太难实现,但不会带来太多好处。:)
;; #s for succeed.
(current-readtable
  (make-readtable (current-readtable)
                  #\s
                  'dispatch-macro
                  (lambda (ch port src line col pos) succeed)))

;; #u for fail.
(current-readtable
  (make-readtable (current-readtable)
                  #\u
                  'dispatch-macro
                  (lambda (ch port src line col pos) fail)))