Что эквивалентно процедуре отдыха в SICP в схеме MIT 9.2?

Я выполняю упражнение 2.32, в котором представлен следующий код:

(define (subsets s)
  (if (null? s)
      (list nil)
      (let ((rest (subsets (cdr s))))
        (append rest (map <??> rest)))))

Когда я пытаюсь позвонить rest процедура в схеме MIT 9.2 она не распознает процедуру (есть аналогичная проблема с nil в книге, которая заменяется () в современной схеме). Что является эквивалентом rest процедура в современной схеме? Я не верю, что это cdr так как cdr используется на протяжении всей книги.

2 ответа

Решение

Вы неправильно понимаете упражнение - rest это не процедура, это локальная переменная, которая соответствует остальным подмножествам (возможно, вам следует взглянуть на документацию относительно let). Вот что просит книга:

(define (subsets set)
  (if (null? set)
      (list '())
      (let ((rest (subsets (cdr set))))
        (append rest
                (map (lambda (sets) (cons (car set) sets))
                     rest)))))

Как указывает @tfb, rest в этом коде это не процедура, это локально связанный символ.

Возможно, вы неправильно интерпретируете сообщение об ошибке rest; не видя этого, трудно сказать.

Другие вопросы по тегам