Dowiedziałem się sporo schematu z SICP, ale teraz jestem bardziej zainteresowany wspólnym seplenieniem. Wiem, że typowe seplenienie fold
jest reduce
, ze specjalnymi argumentami dla lewego lub prawego składania, ale co jest odpowiednikiem unfold
? Googling nie pomógł wiele. W rzeczywistości mam wrażenie, że się nie rozwinęło ???"Rozwiń" dla wspólnego seplenienia?
Odpowiedz
Common Lisp ma (loop ... collect ...)
. Porównaj
(loop for x from 1 to 10 collect (* x x))
z jej równoważność za pomocą unfold
:
(unfold (lambda (x) (> x 10)) (lambda (x) (* x x)) (lambda (x) (+ x 1)) 1)
Ogólnie (unfold p f g seed)
jest w zasadzie
(loop for x = seed then (g x) until (p x) collect (f x))
Edit: literówka naprawić
Zwykłe hiperpecki lisp nie definiuje funkcji unfold
, ale z pewnością możesz napisać własną. Jego definicja schematu tłumaczy prawie symbol dla symbolu.
Dzięki. To niefortunne, ale przypuszczam, że napiszę własne. Naprawdę lubię schemat bycia tak czystym i posiadającym tak piękną, funkcjonalną dobroć, ale w pewnym sensie zrezygnowałem z nauki splątanego, ale ekspresyjnego wspólnego seplenienia. To trochę jak nauka angielskiego, a nie esperanto, wiesz? – nullpointer
Hmm, to interesujące. Przez ostatnią godzinę bawiłem się z pętlą: P to świetne rzeczy! Uwielbiam, gdy języki programowania mają te małe wbudowane podhasła, które mają własną składnię i zbiór reguł do zrozumienia, takich jak ciągi formatów. Pętla to potężne rzeczy! – nullpointer
Witaj w ciemnej stronie. – huaiyuan