【问题标题】:finding an alternative for a let binding of a define-syntax为定义语法的 let 绑定寻找替代方案
【发布时间】:2021-05-03 07:58:16
【问题描述】:

我正在尝试将一些旧的 guile 1.8 代码更新为 guile 3.x。我正在努力为特定构造找到一个好的替代品。

这是一个代表旧 1.8 代码的示例:

(define h (make-hash-table 31))

(define (def-node name-args types)
  (let ((name (car name-args))
        (args (cdr name-args)))
    (hashq-set! h name
                (list name args types))))

(define define-node
  (defmacro:syntax-transformer
    (lambda arg-list
      (apply def-node arg-list)
      #f)))

(define (make-nodes)
  (let ((def define-node))
    (def (a b . c) (BT . CT))
    (def (d e . f) (ET . FT))))

(make-nodes)

(display (hashq-ref h 'a))
(newline)
(display (hashq-ref h 'd))
(newline)

我希望更新define-node 和/或def-node,同时保持make-nodes 不变。到目前为止,我已经像这样重写了define-node

(define-syntax define-node
  (lambda (x)
    (syntax-case x ()
      [(_ name-args arg-types)
       #'(def-node 'name-args 'arg-types)])))

这似乎是define-node 的合理替换,但它不适用于当前的make-nodesmake-nodes 中的let 无效。我必须用这个替换make-nodes

(define (make-nodes)
    (define-node (a b . c) (BT . CT))
    (define-node (d e . f) (ET . FT)))

哪个可以,但我想知道是否有可能找到一个我不必修改make-nodes的解决方案?

【问题讨论】:

    标签: scheme guile


    【解决方案1】:

    您需要更改make-nodes。如果您考虑像

    这样的表达式
    (let ((def define-node))
      (def (a b . c) (BT . CT))
      (def (d e . f) (ET . FT))))
    

    与此相同

    ((λ (def)
       (def (a b . c) (BT . CT))
       (def (d e . f) (ET . FT)))
     define-node)
    

    然后(def (a b . c) (BT . CT)) 的评估涉及首先评估参数......这将失败。

    我不清楚这怎么能与let 的健全版本一起工作。

    因此,您需要使用 let-syntax 之类的东西来制作本地宏。我不知道 Guile 有没有,如果没有的话应该有。


    我认为,在 R5RS 方案中,如果您添加 make-hasheqvhash-set!,我认为以下内容将有效哈希位:

    (define h (make-hasheqv))
    
    (define (def-node name-args types)
      (let ((name (car name-args))
            (args (cdr name-args)))
        (hash-set! h name
                    (list name args types))))
    
    (define (make-nodes)
      (let-syntax ((def (syntax-rules ()
                          ((_ name-args types)
                           (def-node 'name-args 'types)))))
        (def (a b . c) (BT . CT))
        (def (d e . f) (ET . FT))))
    

    【讨论】:

      猜你喜欢
      • 2020-02-16
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多