2010-04-14 4 views
3

У меня есть макрос Схемы и длинный список, и я бы хотел отобразить макрос в списке, как если бы это была функция. Как я могу это сделать с помощью 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)) 

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

+1

Я думаю, что сделать ваш вопрос более конкретным может оказаться полезным. –

+0

Что такое a1 b1 ...? Являются ли они атомарными? Они кодируют? Не зная больше данных, и макрос z5H, вероятно, имеет лучший ответ. – Davorak

+0

Нет ограничений на то, что a1 b1 ... есть. Могут быть атомы, могут быть списки, что угодно ... – josh

ответ

1

Развивая ответ 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) 

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

Что в конечном итоге получение оценивается из (карты-макро торговли тест-лист) является:

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

Что не совсем карта, но я считаю, он отвечает на ваш вопрос.

+0

Итак, это в основном означает, что я не могу выбрать макрос «map-syntax», который будет итеративно (в самом макросе) расширяться до тех пор, пока Mac не будет расширен для всех членов списка? (Конечно, мне пришлось бы передавать список в буквальном смысле макроса, а не в переменной!) – josh

+1

Вы можете эффективно написать карту-макрос, если у вас есть среда взаимодействия в предпочтительной версии схемы R5RS. среда взаимодействия является необязательной в спецификации R5RS. Он существует в DrScheme или независимо от нового имени. Я отредактировал свой ответ, чтобы привести пример макро-макроса. – Davorak

0

Будет что-то вроде

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

работа?

+0

Макрос принимает varargs, поэтому приведенное выше решение приводит к ошибке. – josh

+0

Я не понимаю, почему это означает, что вы получите ошибку. Вы имеете в виду, что списки внутри моего списка могут иметь разную длину? –

+1

@Jay Korninek, макрос может манипулировать тем, что находится внутри a1 b1 ... так как я не думаю, что мы можем предположить, что они являются атомарными. – Davorak

2

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

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

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

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

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

+0

Я считаю, что он хочет, чтобы макрос был расширен до компиляции (правильно?). Я не уверен в Scheme, но я много сделал в Common Lisp с defmacro (код внутри defmacro использовал бы множество других функций, чтобы преобразовать S-выражения (даже используемые глобальные хэш-таблицы!)). Макрос будет определять несколько функций ... – Jay

Смежные вопросы