Clojure 我不知道';我不理解(doc fn)…它说我可以命名函数,但我可以';你不叫它的名字吗?

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的新手,我正在理解这些概念。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


      fn的名称arg也用于使stacktraces更具可读性,并使识别哪个匿名fn看到错误/仅/经常/修复;-)@noisesmith Aha!就是这样。我明白了。repl通常会将最后三个已计算的内容绑定到*1*2和*3,因此它不会保存在任何位置。@leograpenthin
      (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