“Desdobrar” para Common Lisp?
-
06-07-2019 - |
Pergunta
Eu aprendi um pouco de esquema de SICP mas estou mais interessado em Lisp comum agora. Eu sei fold
do Lisp comum é reduce
, com argumentos especiais para dobrar a esquerda ou direita, mas o que é o equivalente a unfold
? Googling não ajudou muito. Na verdade tenho a impressão de que não há desdobrar ???
Solução
Lisp Comum tem (loop ... collect ...)
. Compare
(loop for x from 1 to 10 collect (* x x))
com sua equivalência usando unfold
:
(unfold (lambda (x) (> x 10)) (lambda (x) (* x x)) (lambda (x) (+ x 1)) 1)
Em geral, (unfold p f g seed)
é basicamente
(loop for x = seed then (g x) until (p x) collect (f x))
Edit: correção erro de digitação
Outras dicas
O HyperSpec Common Lisp não define uma função unfold
, mas certamente você pode escrever o seu próprio. Sua definição esquema traduz quase símbolo para símbolo.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow