Scheme miniKanren:如何定义s和u?
在miniKanren中,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之后 ;用于上下文]
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)))