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 ???

Foi útil?

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
scroll top