在Scheme中解构记录
我正在学习Scheme,来自C/C++背景。我非常习惯于将相关的值组合到结构中,我发现Scheme的记录在这方面工作得非常好 如果我发现自己经常这样做是为了避免功能体中的视觉噪音:在Scheme中解构记录,scheme,lisp,Scheme,Lisp,我正在学习Scheme,来自C/C++背景。我非常习惯于将相关的值组合到结构中,我发现Scheme的记录在这方面工作得非常好 如果我发现自己经常这样做是为了避免功能体中的视觉噪音: (define (f pt z) (let* ((x (point-x pt)) (y (point-y pt)) (d (* x y z))) ...) 其中,pt是一个点记录。是否有较短的方法来绑定/解构记录的字段?理想情况下,这将在let绑定中工作,但我无法找到一种方法来
(define (f pt z)
(let*
((x (point-x pt))
(y (point-y pt))
(d (* x y z)))
...)
其中,pt
是一个点
记录。是否有较短的方法来绑定/解构记录的字段?理想情况下,这将在let
绑定中工作,但我无法找到一种方法来编写一个宏来实现这一点,或者如果这是可能的话。在Racket中,我们可以使用它来分解记录的字段结构。如果这是一个更好的方法,这是有争议的
(define (f pt z)
(match pt
[(point x y)
(let ([d (* x y z)])
...)]))
如果您使用的是chez方案,我建议在此处使用Alex Shinn的匹配端口:。您可以使用它与chez的r6rs记录(以及许多其他记录)进行匹配。自从我提出这个问题以来,我在Scheme宏方面做得更好,我目前正在使用这个宏:
(define-syntax derecord
(syntax-rules ()
((_ record ([name record-accessor] ...) body-forms ...)
(let ([name (record-accessor record)] ...)
body-forms ...))))
它给出了如下语法:
(derecord my-rec ([x my-rec-x] [y my-rec-y])
(* x y))
它只比在let中手动操作稍微好一点,但我想我会把它发布给像我这样的初学者。我们讨论的是什么样的方案?你肯定已经进入了一个重要的领域,要提到你正在使用的方案;这是一个不同方案变体差异很大的领域。我使用Chez方案,但我试图坚持使用R6RS,因为我试图在这一点上不承诺任何特定的变体。