首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何绑定使用自己的表达式?

如何绑定使用自己的表达式?
EN

Stack Overflow用户
提问于 2015-09-09 07:32:25
回答 2查看 72关注 0票数 4

因为我有一个lazy-seq来计算斐波纳契序列。

代码语言:javascript
运行
复制
(def fibonacci
  (lazy-cat [0 1] (map + fibonacci (rest fibonacci))))
=> #'user/fibonacci
(take 10 fibonacci)
=> (0 1 1 2 3 5 8 13 21 34)

但是当我试图把fibonacci放到let

代码语言:javascript
运行
复制
(let [fibonacci
  (lazy-cat [0 1] (map + fibonacci (rest fibonacci)))]
  (take 10 fibonacci))
CompilerException java.lang.RuntimeException: Unable to resolve symbol: fibonacci in this context, compiling:...

如何解决这个问题?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-09 08:48:12

def不同,x(let [x f] ...)制造的f的绑定在f中不可见。更准确地说,绑定到x是在评估f之后完成的。为了具有递归定义,您需要使用letfn,它用于定义函数。因此,您不能再将fibonacci视为LazySeq,但可以将其定义为返回LazySeq的函数。

代码语言:javascript
运行
复制
(letfn [(fibonacci [] 
          (lazy-cat [0 1] (map + (fibonacci) (rest (fibonacci)))))]
  (take 10 (fibonacci)))
票数 5
EN

Stack Overflow用户

发布于 2015-09-09 08:20:03

看起来,如果您希望该构造在let中工作,那么您将无法编写这样的代码类型:

代码语言:javascript
运行
复制
(defn override-variables [x]
  (let [x (do-some-stuff-with x)]
    (do-stuff x))

在这种情况下,用局部变量定义懒散序列的情况要频繁得多。

但是,如果用(fn fib-func [args] ...)命名匿名函数,并根据函数而不是变量构造延迟-seq,则可以在它的体内调用匿名函数。

代码语言:javascript
运行
复制
(let [fib ((fn rfib [a b] 
             (lazy-seq (cons a (rfib b (+ a b)))))
           0 1)]
  (take 10 fib)) 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32473476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档