首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包,文字向量与函数结果不同

闭包,文字向量与函数结果不同
EN

Stack Overflow用户
提问于 2013-09-22 15:08:13
回答 1查看 280关注 0票数 3

我试着用clojure的复调库来做音乐。为了产生有趣的声音,加性合成是有用的,这意味着我取几个频率的窦性振子,然后简单地把它们加起来。在泛音中,创建一个合成器,实现这一点,我可以写:

代码语言:javascript
复制
(definst myinst [freq 100]
  (* 0.2 (reduce + (map sin-osc [101.0 100 99.0]))))

为了更好地重用,我编写了一个函数,它接受一个频率并返回一个包含所有这些频率的列表,您可以在代码片段中看到:

代码语言:javascript
复制
(defn split-freq [freq]
  (apply vector (map #(* freq %) [1.01 1 0.99])))

在执行(split-freq 100)时,REPL给出了以下内容:

代码语言:javascript
复制
[101.0 100 99.0]

与输入完全相同,我提供了上面的map函数。事实上,我复制了结果。现在,我试试看:

代码语言:javascript
复制
(definst myinst [freq 100]
  (* 0.2 (reduce + (map sin-osc (split-freq freq)))))

不幸的是,REPL告诉我,我做错了:

代码语言:javascript
复制
CompilerException java.lang.ClassCastException: 
overtone.sc.machinery.ugen.sc_ugen.ControlProxy cannot be cast to java.lang.Number, 
compiling:(form-init1807789563491679853.clj:1)

但这段代码运行良好:

代码语言:javascript
复制
(definst myinst [freq 100]
  (* 0.2 (reduce + (map sin-osc (apply vector (map #(* freq %) [1.01 1 0.99]))))))

不过,我只是简单地输入了函数定义。

我想我主要是缺乏理解。我想,如果其中一个版本有效,其他版本也必须工作。

我的问题是:为什么我的“改进”版本不起作用?为什么第一个片段起作用了?我怎样才能避开这种行为呢?

代码语言:javascript
复制
Clojure 1.3.0
Overtone 0.8
(use 'overtone.core)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-09-24 09:00:46

ups,你说得对,我不明白噪音匠的评论。确实,您不能在函数中直接使用这个值"freq“,因为在函数需要时(在宏执行之前),这个值不受绑定。

因此,这里有一个解决这个问题的方法,也可以使用let表单,它不太优雅,可以自己制作宏,但是可以工作。

代码语言:javascript
复制
(defn myinst [inst-name]
  (let [the-freq 100]
   (definst inst-name [freq the-freq] (* 0.2 (reduce + (map sin-osc (split-freq the-freq)))))))

并且可以作为正常函数执行。

代码语言:javascript
复制
((myinst "my-instrument"))

我希望这对你有帮助

胡安

先前的评论,现在无效的回应

也许您在改进的版本中对参数值声明犯了错误。

这是你的代码

代码语言:javascript
复制
(definst myinst [freq 100]
  (* 0.2 (reduce + (map sin-osc (split-freq freq)))))

而且,就像clojure中一样,您不能将默认值赋值给参数函数,如果您使用let表单来分配默认值,则改进后的版本将能工作。

代码语言:javascript
复制
(definst myinst []
  (let [freq 100]
    (* 0.2 (reduce + (map sin-osc (split-freq freq))))))  
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18945265

复制
相关文章

相似问题

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