首页 文章

球拍阅读器宏

提问于
浏览
18

有没有办法在Racket中制作简单的阅读器宏 . 我的意思是像这样的概括:

(define-reader-syntax "'" quote)
; finds expressions that start with "'" and wraps them in `(quote ...)`
'(foo) ; => (quote (foo))
'foo ; => (quote foo)

我使用内置语法来明确我的意思 . 我'd like to use this for is replicating clojure'的速记lambda (#(+ 1 %) 5) ; => 6 之一

看起来很容易定义一个“shorthand-lambda”宏并将“#”前缀映射到它 .

2 回答

  • 17

    以下是如何实现速记lambda:

    #lang racket
    
    (define rt (make-readtable #f #\# 'non-terminating-macro
                               (λ (c in . _)
                                 (define body (read in))
                                 `(lambda (%) ,body))))
    (parameterize ([current-readtable rt]
                   [current-namespace (make-base-namespace)])
      (eval (read (open-input-string "(#(+ 1 %) 5)")))) ;; => 6
    

    以下是如何实现更简单的示例,使 & 等效于 '

    (define rt2 (make-readtable #f #\& #\' #f))
    
    (parameterize ([current-readtable rt2]
                   [current-namespace (make-base-namespace)])
      (eval (read (open-input-string "&(3 4 5)")))) ;; => '(3 4 5)
    
  • 8

    查看readtablesreader extensions上的指南条目,了解如何执行此操作 . 这reference section也很有用 . 可读扩展比您的示例复杂一点,但它们非常强大 .

    对于您的具体问题,SRFI-26为Scheme提供了类似的语法,Sam Tobin-Hochstadt写了一个fancy app Racket宏来实现Scala对此的看法 .

相关问题