代码之家  ›  专栏  ›  技术社区  ›  Cam

如何使只是一个宏的一部分

  •  1
  • Cam  · 技术社区  · 15 年前

    lambda lambda-r ,从中你可以 return

    (+ ((lambda-r ()
        (return 1)
        2)) 5)
    

    这将给出 6

    这是一个我正在寻找的转型的例子。假设有一个 λ-r

    (lambda-r (a b)
        (return a)
        (+ a b))
    

    我想把它变成这样:

    (call/cc (lambda (k)
           (define return (lambda (v)
                            (k (lambda (a b)
                                 v))))
           (lambda (a b)
             (return a)
             (+ a b))))
    

    也可以用let表达式而不是内部define来表示,但是为了清晰起见,我使用define。

    问题 λ-r 作为一个 . 原因是我想 k v 为了卫生,但我不想 保持卫生。

    (define-syntax lambda-r
      (syntax-rules (return)
        [(_ (var ...) body ...)
         (call/cc (lambda (k)
               (define return (lambda (v)
                                (k (lambda (var ...)
                                     v))))
               (lambda (var ...)
                 body ...)))
         ]))
    

    这不管用,因为 返回 经过卫生处理,因此在使用时不能直接看到 λ-r . 所以呢 (lambda-r () (return 1)) 给出了一个错误 返回 不是有效的标识符。


    • syntax
    • 这个 datum->syntax / syntax->datum

    编辑:没关系-我现在有了:)

    1 回复  |  直到 15 年前
        1
  •  2
  •   Nathan Shively-Sanders    15 年前

    syntax-case 而不是 syntax-rules

    The R6RS definition 给出了一些例子,特别是 a section on syntax-object and datum conversions ,这就是你想要的。你应该能够适应 loop w型/ break 你的榜样 return .