有没有办法在球拍中制作简单的阅读器宏?我的意思是像这样的概括:
(define-reader-syntax "'" quote)
; finds expressions that start with "'" and wraps them in `(quote ...)`
'(foo) ; => (quote (foo))
'foo ; => (quote foo)
我使用了一个内置的语法来阐明我的意思。我想用它来做的一件事是复制clojure的速记lambda (#(+ 1 %) 5) ; => 6
似乎只需定义一个“速记-lambda”宏并将"#“前缀映射到该宏将非常容易。
发布于 2011-11-28 08:35:30
下面是如何实现速记的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)
发布于 2011-11-28 08:15:22
请查看readtables和reader extensions上的指南条目,了解如何执行此操作。这个reference section也很有用。Readtable扩展比你的例子稍微复杂一些,但它们非常强大。
对于您的特定问题,SRFI-26为Scheme提供了类似的语法,Sam Tobin-Hochstadt编写了一个Scala球拍宏来实现fancy app的这一点。
https://stackoverflow.com/questions/8289825
复制相似问题