adr*_*usi 19 lisp macros scheme racket
有没有办法在Racket中制作简单的阅读器宏.我的意思是像这样的概括:
(define-reader-syntax "'" quote)
; finds expressions that start with "'" and wraps them in `(quote ...)`
'(foo) ; => (quote (foo))
'foo ; => (quote foo)
Run Code Online (Sandbox Code Playgroud)
我使用内置语法来明确我的意思.我想用它做的一件事就是复制clojure的速记lambda(#(+ 1 %) 5) ; => 6
看起来很容易定义一个"shorthand-lambda"宏并将"#"前缀映射到它.
Sam*_*adt 18
以下是如何实现速记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
Run Code Online (Sandbox Code Playgroud)
以下是如何实现更简单的示例,使其&等效于':
(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)
Run Code Online (Sandbox Code Playgroud)