2013-04-25 3 views
1

Мне интересно, что происходит с тем, как я определяю схему for-loop в схеме. Всякий раз, когда я пытаюсь запустить оператор for, он работает довольно долго, а затем сработает.проблема определения-синтаксиса в схеме

(define-syntax for 
    (syntax-rules (:) 
    [(_ (initial : test : update) body) 
    (begin initial 
      (if test 
       (begin body update 
         (for [test : update] body))))] 
    [(_ (test : update) body) 
    (if test 
     (begin body update 
       (for [test : update] body)))])) 

Он должен запустить начальное условие, проверить тест, запустить тело, а затем выполнить цикл до следующего прогона.

ответ

3

Ваш макрос не работает, потому что макрос рекурсивный и нет базового футляра. Таким образом, во время компиляции макрос расширяется и расширяется снова и снова расширяется, навсегда.

Вот реализация:

(define-syntax for 
    (syntax-rules (:) 
    ((_ (initial : test : update) body) 
    (begin initial 
      (let repeating() 
       (when test 
       body 
       update 
       (repeating))))) 
    ((_ (test : update) body) 
    (for (#f : test : update) body)))) 


> (let ((foo 0)) 
    (for ((set! foo 5) : (positive? foo) : (set! foo (- foo 1))) ;; w/ init 
     (begin (display 'YES) (newline)))) 
YES 
YES 
YES 
YES 
YES 
> (let ((foo 2)) 
    (for ((positive? foo) : (set! foo (- foo 1))) ;; w/o init 
     (begin (display 'YES) (newline))) 
YES 
YES 
Смежные вопросы