Схема - динамическая область действия и бесконечный цикл - PullRequest
3 голосов
/ 23 декабря 2011

Я прочитал книгу о схеме, и у нее есть следующий пример:

(define map
   (lambda (f s)
     (if (null? s)
         '()
          (cons (f (car s))
                (map f (cdr s)))))

(map (lambda (s)
        (set! s '(1 2 3 4))
        'hello)
     '(a b c d))

Это говорит о том, что в динамическом объеме мы войдем в бесконечный цикл. Но почему? Как я понял, после того как мы подадим заявку, мы приедем на карту с

f = (lambda (s)
        (set! s '(1 2 3 4))
        'hello)

и s = '(a b c d). Теперь для первого запуска мы применим f к (car '(a b c d):

((lambda (s)
    (set! s '(1 2 3 4))
    'hello)
 (car '(a b c d)))

А теперь изменилось a на (1 2 3 4). И так далее .. Где здесь петля?

1 Ответ

1 голос
/ 23 декабря 2011

Я думаю, что автор имеет в виду, что после выполнения f (car s) значение s будет '(1 2 3 4), поэтому значение (cdr s) будет '(2 3 4), поэтому вы будете вызывать (map f '(2 3 4)) каждый раз до бесконечности.

Однако я не думаю, что это точное описание динамического определения объема. Поскольку s является параметром лямбды (и, следовательно, не является свободной переменной), set! должен влиять только на этот параметр, а s функции map не должен изменяться. Так что не должно быть бесконечного цикла - используете ли вы динамическую область видимости или нет. И если я перевожу код в elisp (который динамически ограничен), код фактически не вызывает бесконечный цикл. Поэтому я бы сказал, что ваша книга ошибочна, говоря, что при использовании динамической области видимости будет бесконечный цикл.

...