Clojure 我不知道';我不理解(doc fn)…它说我可以命名函数,但我可以';你不叫它的名字吗?
我是Clojure的新手,我正在理解这些概念。REPL帮助我获取“东西”的文档。所以我想定义一个函数Clojure 我不知道';我不理解(doc fn)…它说我可以命名函数,但我可以';你不叫它的名字吗?,clojure,Clojure,我是Clojure的新手,我正在理解这些概念。REPL帮助我获取“东西”的文档。所以我想定义一个函数 clojure-noob.core> (doc fn) ------------------------- clojure.core/fn (fn name? [params*] exprs*) (fn name? ([params*] exprs*) +) Special Form ... name => symbol …医生建议我可以命名我的函数。REPL接受我
clojure-noob.core> (doc fn)
-------------------------
clojure.core/fn
(fn name? [params*] exprs*)
(fn name? ([params*] exprs*) +)
Special Form
...
name => symbol
…医生建议我可以命名我的函数。REPL接受我的函数,但我无法调用它,“无法解析符号…”
关于(doc fn)
的输出,显然有一些我不理解的地方。特别是,名称是什么?
,您可以用它做什么?我正在努力学习如何阅读文件以及理解fn特殊表格。谢谢。从REPL调用(fn添加对[ab](+ab))
生成该函数的实例,然后将其打印到屏幕上。在那之后,它消失了,并没有保存在任何地方。这就是为什么不能使用doc
功能获取它的文档。fn
literal中的name参数通常用于进行递归调用,并不意味着它将以该名称保存在任何位置
如果您调用(defn add pair[ab](+ab))
,它会将函数保存到名称空间中,然后doc
函数可以稍后查找它并打印它的文档字符串。从REPL调用(fn add pair[ab](+ab))
生成该函数的实例,然后将其打印到屏幕上。在那之后,它消失了,并没有保存在任何地方。这就是为什么不能使用doc
功能获取它的文档。fn
literal中的name参数通常用于进行递归调用,并不意味着它将以该名称保存在任何位置
如果调用(defn add pair[ab](+ab))
则它会将函数保存到名称空间中,然后doc
函数可以稍后查找并打印其文档字符串。
表单计算为函数对象fn
- 您可以立即应用函数对象:
((fn[ab](+ab))11;=>2
- 如果要在本地引用函数对象,请使用
绑定:let
(让[添加对(fn[ab](+ab))](添加对1));=>2
- 函数对象的值与
或1
:[3:a]
(让[double(fn[n](*2n))] ({double(comp-double)}double)3) ;=>12
绑定在let
表单中不存在-您需要一个 名称参数:fn
((fn事实[n](案例n,01,(*n(事实(dec n ')))))5);=>120
同时执行以下两项操作:letfn
(letfn[(事实[n](案例n,01,(*n(事实(dec n ')))))](事实5));=>120
- 如果希望函数可以全局访问,请将其绑定到
使用var
:def
(定义事实(fn事实[n](案例n,01,(*n(事实)(dec n '))))
(事实5);=>120
宏更简洁地执行相同的操作:defn
(defn事实[n](案例n,01,(*n(事实(dec n)'))))
(事实5);=>120
表单计算为函数对象fn
- 您可以立即应用函数对象:
((fn[ab](+ab))11;=>2
- 如果要在本地引用函数对象,请使用
绑定:let
(让[add pair(fn[ab](+ab))](add pair 1));=>2
- 函数对象的值与
或1
:[3:a]
(让[double(fn[n](*2n))] ({double(comp-double)}double)3) ;=>12
绑定在let
表单中不存在-您需要一个 名称参数:fn
((fn事实[n](案例n,01,(*n(事实(dec n ')))))5);=>120
同时执行以下两项操作:letfn
(letfn[(事实[n](案例n,01,(*n(事实(dec n ')))))](事实5));=>120
- 如果希望函数可以全局访问,请将其绑定到
使用var
:def
(定义事实(fn事实[n](案例n,01,(*n(事实)(dec n '))))
(事实5);=>120
宏更简洁地执行相同的操作:defn
(defn事实[n](案例n,01,(*n(事实(dec n)'))))
(事实5);=>120
(clojure.repl/doc*1)
=>“clojure.core/*1在repl线程中绑定到最近打印的值”因此它不适用于这个问题。它描述的是*1
值本身,而不是它的当前内容。fn
的名称arg也用于使stacktraces更具可读性,并且更容易识别哪些匿名fn看到了错误/仅/经常/…修复;-)@noisesmith Aha!就这样。我明白了。repl通常会将最后三个已计算的内容绑定到*1*2和*3,因此它不会保存在任何位置。@LeonGrapenthin(clojure.repl/doc*1)
=>“clojure.core/*1绑定到repl线程中打印的最新值”,因此它不适用于这个问题。它描述了*1
值本身,而不是它的当前内容。
clojure-noob.core> (fn add-pair [a b] (+ a b))
#<core$eval3364$add_pair__3365 clojure_noob.core$eval3364$add_pair__3365@6fb5a33b>
clojure-noob.core> (add-pair 1 2)
CompilerException java.lang.RuntimeException: Unable to resolve symbol: add-pair in this context, compiling:(/private/var/folders/1g/fnytl2x93sx6hp2f1rsf4h1r5xtqv_/T/form-init6828995349142227131.clj:1:1)
clojure-noob.core>
clojure-noob.core> (def another-add-pair (fn [a b] (+ a b)))
clojure-noob.core> (another-add-pair 1 2)
3
clojure-noob.core> (defn yet-another-add-pair [a b] (+ a b))
#'clojure-noob.core/yet-another-add-pair
clojure-noob.core> (yet-another-add-pair 3 4)
7