【问题标题】:Change variable outside of lambda in Scheme/Racket在 Scheme/Racket 中更改 lambda 之外的变量
【发布时间】:2020-02-09 05:22:30
【问题描述】:

来自 Racket 文档的示例总是带有 lambdahttps://docs.racket-lang.org/syntax/Defining_Simple_Macros.html

而我的define-syntax-parser是这样的:

(require syntax/parse/define)
(define-syntax-parser sp
  [_ #'(lambda (x) (set! x (add1 x)))]
)

(define a 0)
((sp) a)
(display a)

可能做这样的事情(删除lambda)?

(require syntax/parse/define)
(define-syntax-parser sp
  [(f x) #'(set! x (add1 x))]
)

(define a 0)
(f a)
(display a)

结果应为1,但仍为0。而且 Scheme/Racket 不通过引用传递(?!),那么如何在 lambda 之外更改这些变量?

这里有一个相关的答案:https://stackoverflow.com/a/8998055/5581893 但这是关于已弃用的define-macro (https://docs.racket-lang.org/compatibility/defmacro.html)

【问题讨论】:

    标签: lambda syntax macros scheme racket


    【解决方案1】:

    宏可以扩展到任何东西,而不仅仅是lambda

    #lang racket
    
    (require syntax/parse/define)
    
    (define-simple-macro (sp x:id) (set! x (add1 x)))
    
    (define a 0)
    (sp a)
    (display a)
    

    或者,如果您更喜欢使用define-syntax-parser

    #lang racket
    
    (require syntax/parse/define)
    
    (define-syntax-parser sp
      [(_ x:id) #'(set! x (add1 x))])
    
    (define a 0)
    (sp a)
    (display a)
    

    【讨论】:

    • tks,把我从那个邪恶的 lambda 中救了出来 :)
    • define-simple-macro 与 define-syntax-rule 有何不同?他们看起来和做同样的事情
    • 除了define-simple-macro 支持syntax-parse 功能外,它们基本相同。像{~datum ...} 或语法类:id 这样的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 2019-04-13
    • 1970-01-01
    • 2012-10-24
    • 2018-11-10
    • 2014-03-08
    • 1970-01-01
    相关资源
    最近更新 更多