2009-10-26 2 views
9

Я узнал довольно много схемы из SICP, но теперь я больше заинтересован в распространении lisp. Я знаю, что общий lisp fold - reduce, со специальными аргументами для складывания влево или вправо, но что эквивалентно unfold? Googling не очень помог. На самом деле у меня создается впечатление, что не разворачивается ???«разворачивается» для общего lisp?

ответ

13

Common Lisp имеет (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)) 

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

+2

Хм это интересно. Я играл с петлей в течение последнего часа: P его отличный материал! Мне нравится, когда языки программирования имеют эти небольшие встроенные подъязыки, которые имеют собственный синтаксис и набор правил для понимания, например, строки формата. Loop - мощный материал! – nullpointer

+2

Добро пожаловать в темную сторону. – huaiyuan

3

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

+3

Спасибо. Это несчастливо, но я полагаю, да, я напишу свой. Мне очень нравится схема для того, чтобы быть таким чистым и иметь такую ​​прекрасную функциональную доброту, но я вроде как смирился с изучением запутанного, но выразительного общего lisp. Знаешь, это похоже на изучение английского, а не эсперанто. – nullpointer

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