给定一个带有许多数字字段的 Chez Scheme 记录,这些字段不断地被小增量和减量(通常是一个)改变,有没有办法编写一个可以通过将字段传递给字段值来改变字段值的宏?我现在完成此操作的方式类似于以下 REPL 成绩单:
Chez Scheme Version 9.5.4
Copyright 1984-2020 Cisco Systems, Inc.
> (define-record-type r (fields (mutable x) (mutable y)
;; and so on...
))
> (define my-r (make-r 3 5
;; and so on...
))
> (r-x-set! my-r (+ (r-x my-r) 1))
> my-r
#[#{r gak6l6ll8wuv7yd61kiomgudo-2} 4 5]
最好有一个简单的宏,比如inc!
,它可以对记录中的字段执行变异递增/递减操作。我从类似 Lisp的Scheme 版本开始incf
,decf
(define-syntax inc!
(syntax-rules ()
((_ x) (begin (set! x (+ x 1)) x))))
(inc! (r-x my-r)) ;; Syntax error
这适用于“正常”变量(并且易于实现),但在这种情况下dec!
,它不使用设置可变记录字段的机制。r-x-set!
有没有明显的方法来编写这样的宏?您可以只传递对记录字段的引用而不必为每个字段编写不同的东西吗?