2013-09-20 4 views
1

Я искал синтаксис для определения правила синтаксиса, но я все еще застрял.Синтаксис синтаксиса-правила

Я хочу, чтобы определить правило с этой подписью:.. (Определить-синтаксическое правило ({Вала в LST} возвратный Рез)

В основном это просто применяет карту учитывая вал и LST Но я борется с синтаксисом. Это то, что я придумал до сих пор. .... (синтаксис-rules() ((для val in lst) (карта (val lst)))) . ..

вход будет что-то вроде:

(для {Вала в «(0 1 2 3 4) } return (- val 1) )

и вывод (-1 0 1 2 3), как если бы карта была вызвана в списке.

+0

Вы не можете использовать 'define-syntax-rule', поскольку у вас есть литералы в определении (т.е.' in' и 'return'). @ Ответ GoZoner (если вы добавите parens вокруг '(val in list)'), вы получите то, что хотите. (И в Racket фигурные скобки такие же, как и обычные parens.) – stchang

+0

Кстати, Racket поставляется с ['for/list'] (http://docs.racket-lang.org/reference/for.html?q = для/list #% 28form ._% 28% 28lib._racket% 2Fprivate% 2Fbase..rkt% 29._for% 2Flist% 29% 29), что делает то же самое, что и вы пытаетесь определить. '(для/list ([val '(0 1 2 3 4)]) (- val 1))' => '' (-1 0 1 2 3)' – stchang

ответ

6

Это получает это сделать:

(define-syntax for 
    (syntax-rules (in return) 
    ((for val in list return exp) 
    (map (lambda (val) exp) list)))) 

> (for x in '(0 1 2 3) return (- x 1)) 
(-1 0 1 2) 

По сути, это именно так, как вы описали. Вам нужны in и return, объявленные как литералы.

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