【发布时间】: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-nodes,make-nodes 中的let 无效。我必须用这个替换make-nodes:
(define (make-nodes)
(define-node (a b . c) (BT . CT))
(define-node (d e . f) (ET . FT)))
哪个可以,但我想知道是否有可能找到一个我不必修改make-nodes的解决方案?
【问题讨论】: