Разрушающие записи в Схеме - PullRequest
0 голосов
/ 08 декабря 2018

Я изучаю Scheme из C / C ++.Я довольно привык объединять связанные значения в структуры, и я обнаружил, что записи Схемы достаточно хорошо работают для этого.

Если я обнаруживаю, что делаю это довольно часто, чтобы избежать визуального шума в функциональных телах:

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

Где pt - запись point.Есть ли более короткий способ связать / деструктурировать поля записи?В идеале это будет работать внутри привязки let, но я не могу найти способ написать макрос, который бы достиг этого, или, если это вообще возможно.

Ответы [ 3 ]

0 голосов
/ 18 декабря 2018

Если вы используете схему chez, я предлагаю порт матча Алекса Шинна здесь: https://github.com/fedeinthemix/chez-matchable.Вы можете сравнить его с записями Chez R6rs (среди прочего).

0 голосов
/ 31 марта 2019

Я стал лучше в макросах 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, но я подумал, что выложу это для любых других начинающих, таких как я.

0 голосов
/ 08 декабря 2018

В Racket мы можем использовать match для деструктурирования полей записи.Это спорный вопрос, если это лучше способ сделать это ...

1005 *
...