Как мне сопоставить макрос со списком в схеме? - PullRequest
3 голосов
/ 14 апреля 2010

У меня есть макрос Scheme и длинный список, и я хотел бы отобразить макрос по списку, как если бы это была функция. Как я могу сделать это с помощью R5RS?

Макрос принимает несколько аргументов:

(mac a b c d)

В списке

(define my-list ((a1 b1 c1 d1)
                 (a2 b2 c2 d2)
                 ...
                 (an bn cn dn)))

И я хотел бы иметь это:

(begin
   (mac a1 b1 c1 d2)
   (mac a2 b2 c2 d2)
   ...
   (mac an bn cn dn))

(Кстати, как вы видите, я бы тоже хотел склеить список аргументов)

Ответы [ 3 ]

2 голосов
/ 14 апреля 2010

Синтаксические расширения расширены до основные формы в начале оценки (до компиляции или интерпретации) с помощью расширителя синтаксиса. -Дибвиг, "The Язык программирования схемы:

Макрос работает по синтаксису. Это происходит перед компиляцией или выполнением. Это дает вам другой способ написания того же кода.

Функция работает с переменными и значениями (это могут быть списки, атомы, числа и т. Д.), Чье значение известно при вызове функции.

Таким образом, отображение макроса не имеет смысла. Вы просите вызвать что-то (расширение макроса), что уже произошло давно.

Если вам нужно что-то, чтобы написать код для вас и оценить его во время выполнения, то это может быть один из тех случаев, когда вам нужно eval.

1 голос
/ 15 апреля 2010

Расширяя ответ z5h на использование eval, методы, приведенные ниже, показывают, как можно написать макрос карты-макроса, если среда взаимодействия реализована в используемой версии R5RS:

(define test-list '((1 2 3 4)
                    (5 6 7 8)))

;Or if your version of scheme implments interaction-environment then:
(define-syntax trade
  (syntax-rules ()
    ((_ a b c d) (display (list b a d c)))))

;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;Careful this is not really mapping. More like combined map and apply.
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
(define-syntax map-macro
  (syntax-rules ()
    ((_ mac ls) (let ((mac-list (map (lambda (lst) (cons 'trade lst)) ls)))
                          (eval 
                           `(begin
                              ,@mac-list)
                           (interaction-environment))))
                        ))

(map-macro trade test-list)
;outputs: (2 1 4 3)(6 5 8 7)

Так что в прошломВызов map-macro оценивает следующее:

То, что в итоге получается из (тестового списка map-macro trade):

(begin
  (trade 1 2 3 4)
  (trade 5 6 7 8))

Что не совсем карта, но я верюэто действительно отвечает на ваш вопрос.

0 голосов
/ 14 апреля 2010

Хотелось бы что-то вроде

(map (lambda (l) (mac (car l) (caar l) (caaar l) (caaaar l))) mylist)

работа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...