Scheme 寻找define语法的let绑定的替代方法

Scheme 寻找define语法的let绑定的替代方法,scheme,guile,Scheme,Guile,我正在尝试将一些旧的Guile1.8代码更新为Guile3.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

我正在尝试将一些旧的Guile1.8代码更新为Guile3.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
,如下所示:

(define-syntax define-node
  (lambda (x)
    (syntax-case x ()
      [(_ name-args arg-types)
       #'(def-node 'name-args 'arg-types)])))
这似乎是对
定义节点
的合理替代,但它不适用于当前的
生成节点
,而
生成节点
中的
let
无效。我必须用以下内容替换
make节点

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

这是可以的,但我想知道是否有可能找到一个解决方案,在那里我不必修改
生成节点

您需要更改
生成节点
。如果你想到这样一个表达

(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(ab.c)(BT.CT))
的评估首先涉及对参数的评估。。。这将失败

我不清楚这是如何与一个健全版本的
let
一起工作的

因此,您需要使用类似于
let syntax
的方法来生成本地宏。我不知道Guile是否有,但如果没有,它应该有


我认为,在R5RS方案中,如果添加
makehasheqv
散列集,下面的方法就行了
我实际上使用Racket进行了测试,但是使用
R5RS
模块语言和合适的
#%require
来获取散列位:

(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))))