2009-10-26 6 views
9

Ich habe einiges von SICP gelernt, bin aber jetzt mehr an Lisp interessiert. Ich kenne gemeinsame Lisp fold ist reduce, mit speziellen Argumenten für die linke oder rechte Faltung, aber was entspricht unfold? Googeln hat nicht viel geholfen. Tatsächlich habe ich den Eindruck, dass es keine Entfaltung gibt ???"Entfalten" für häufiges Lispeln?

Antwort

13

Gemeinsame Lisp hat (loop ... collect ...). Vergleichen

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

mit dessen Gleichwertigkeit unfold mit:

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

Im Allgemeinen (unfold p f g seed) ist im Grunde

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

Edit: beheben Tippfehler

+2

Hmm das ist interessant. Ich habe die letzte Stunde mit Loop gespielt: P ist super! Ich liebe es, wenn Programmiersprachen diese kleine Art von eingebetteten Subsprachen haben, die ihre eigene Syntax und einen Satz von Regeln zu verstehen haben, wie Formatzeichenfolgen. Loop ist ein starkes Zeug! – nullpointer

+2

Willkommen auf der dunklen Seite. – huaiyuan

3

Die allgemeine Lisp hyperspec definiert keine unfold Funktion, aber Sie können sicherlich Ihre eigenen schreiben. Seine Schemadefinition übersetzt fast Symbol für Symbol.

+3

Danke. Das ist bedauerlich, aber ich nehme an, ich schreibe mein eigenes. Ich mag wirklich einen Plan, so rein zu sein und so schöne funktionale Güte zu haben, aber ich habe mich irgendwie damit abgefunden, das wirre, aber ausdrucksvolle gemeine Lispeln zu lernen. Es ist so, als würde man Englisch lernen statt Esperanto, weißt du? – nullpointer