在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绑定中工作,但我无法找到一种方法来

我正在学习Scheme,来自C/C++背景。我非常习惯于将相关的值组合到结构中,我发现Scheme的记录在这方面工作得非常好

如果我发现自己经常这样做是为了避免功能体中的视觉噪音:

(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,因为我试图在这一点上不承诺任何特定的变体。