代码之家  ›  专栏  ›  技术社区  ›  Flux

如何定义“s”和“u”?

  •  0
  • Flux  · 技术社区  · 6 年前

    在miniKanren, succeed (define succeed (== #t #t)) ,和 fail (define fail (=== #t #f)) . 但那你呢 #s #u 作为 成功 理性的阴谋家 ?

    (define #s succeed)

    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码 对于 成功 #u型 失败 在计划和球拍中?

    canonical miniKanren implementation for Scheme 以及 canonical miniKanren implementation for Racket .

    0 回复  |  直到 5 年前
        1
  •  3
  •   soegaard    6 年前

    # . 绑定标识符很简单 s u . 重新定义 #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型 每次读者看到 # 它查询readtable来查看如何处理以下字符。由于读取发生在解析/扩展和求值之前,因此不能简单地通过调用程序中的函数来更改读取器。你需要使用 #reader 扩展机制或创建自己的语言。

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

    https://docs.racket-lang.org/guide/hash-reader.html

        2
  •  1
  •   alinsoar    6 年前

    我用计算机解决了所有的书

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

    另一方面,你应该咨询一下 the source code 由Friedman&Byrd提供。我用麻省理工学院的方案解决了这个问题——没有使用球拍的特殊功能,R6RS就足够了。

        3
  •  1
  •   Flux    5 年前

    #s #u 可以这样定义(参考: Using Racket for The Reasoned Schemer ):

    ;; #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)))
    

    注意,这只适用于REPL。

    这定义了 #s码 #u型 通过修改 readtable .

    SRFI-10 sharp-comma external form ,但结果 #,() 对于大多数人来说,形式可能是尴尬的。对于Scheme,最好只定义 s u 因为目前还没有可移植的方法来定义 .

    推荐文章