我正在学习Scheme,来自C / C ++背景。我已经习惯将相关的值放在结构中了,我发现Scheme的记录对此非常有效。
如果发现自己经常这样做以避免功能体中的视觉噪音:
(define (f pt z)
(let*
((x (point-x pt))
(y (point-y pt))
(d (* x y z)))
...)
哪里pt
是point
记录。是否有更短的方法来绑定/解构记录的字段?理想情况下,这将在let
绑定中工作,但我无法找到一种方法来编写一个可以实现此目的的宏,或者甚至可能。
如果你正在使用chez scheme,我建议Alex Shinn的比赛端口在这里:https://github.com/fedeinthemix/chez-matchable。您可以使用它来匹配chez的r6rs记录(以及许多其他内容)。
在Racket中,我们可以使用match
来解构记录的字段。如果这是一个更好的方法,这是有争议的......
(define (f pt z)
(match pt
[(point x y)
(let ([d (* x y z)])
...)]))
自从我问这个问题以来,我在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))
它只比手动做得好一点,但我想我会把它发布给像我这样的其他初学者。