"развернуть" для общего лиспа? - PullRequest
9 голосов
/ 26 октября 2009

Я узнал довольно много схемы из SICP, но сейчас больше интересуюсь обычным лиспом. Я знаю, что обычный lisp's fold равен reduce, со специальными аргументами для левого или правого свертывания, но что эквивалентно unfold? Поиск в Google не сильно помог. На самом деле у меня сложилось впечатление, что нет разворачивается ???

Ответы [ 2 ]

13 голосов
/ 26 октября 2009

Обычный Лисп имеет (loop ... collect ...). Сравнить

(loop for x from 1 to 10 collect (* x x))

с его эквивалентностью, использующей unfold:

(unfold (lambda (x) (> x 10))
  (lambda (x) (* x x))
  (lambda (x) (+ x 1))
  1)

В общем, (unfold p f g seed) в основном

(loop for x = seed then (g x) until (p x) collect (f x))

Редактировать: исправить опечатку

3 голосов
/ 26 октября 2009

Общая гиперспекция lisp не определяет функцию unfold, но вы, безусловно, можете написать свою собственную. Его определение схемы переводит почти символ для символа.

...