Scheme中的解构记录

问题描述 投票:3回答:3

我正在学习Scheme,来自C / C ++背景。我已经习惯将相关的值放在结构中了,我发现Scheme的记录对此非常有效。

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

(define (f pt z)
  (let*
    ((x (point-x pt))
     (y (point-y pt))
     (d (* x y z)))
   ...)

哪里ptpoint记录。是否有更短的方法来绑定/解构记录的字段?理想情况下,这将在let绑定中工作,但我无法找到一种方法来编写一个可以实现此目的的宏,或者甚至可能。

scheme lisp
3个回答
1
投票

如果你正在使用chez scheme,我建议Alex Shinn的比赛端口在这里:https://github.com/fedeinthemix/chez-matchable。您可以使用它来匹配chez的r6rs记录(以及许多其他内容)。


4
投票

在Racket中,我们可以使用match来解构记录的字段。如果这是一个更好的方法,这是有争议的......

(define (f pt z)
  (match pt
    [(point x y)
     (let ([d (* x y z)])
       ...)]))

0
投票

自从我问这个问题以来,我在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))

它只比手动做得好一点,但我想我会把它发布给像我这样的其他初学者。

© www.soinside.com 2019 - 2024. All rights reserved.