首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >球拍阅读器宏

球拍阅读器宏
EN

Stack Overflow用户
提问于 2011-11-28 07:04:35
回答 2查看 1.9K关注 0票数 18

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

(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”宏并将"#“前缀映射到该宏将非常容易。

EN

回答 2

Stack Overflow用户

发布于 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)
票数 17
EN

Stack Overflow用户

发布于 2011-11-28 08:15:22

请查看readtablesreader extensions上的指南条目,了解如何执行此操作。这个reference section也很有用。Readtable扩展比你的例子稍微复杂一些,但它们非常强大。

对于您的特定问题,SRFI-26为Scheme提供了类似的语法,Sam Tobin-Hochstadt编写了一个Scala球拍宏来实现fancy app的这一点。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8289825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档