【问题标题】:Are clojure forms data or type?clojure 表单是数据还是类型?
【发布时间】:2017-04-08 07:44:49
【问题描述】:

我开始学习clojure。主要来自 Java 和一些脚本语言,作为 clojure(以及所有函数式语言,我假设)的数据部分的代码并不是那么清晰。

从书的第一页开始,我看到了表格。我认为它主要与数据相关,例如#{1 2}。但在其他一些地方,我看到Boolean 标记为form

现在,我假设falseBoolean 类型的一种形式,但我没有看到type 被多次提及,所以我很困惑。

有人可以推动我理解表单的概念,也可以推动我将代码理解为语言的数据部分吗?

【问题讨论】:

标签: clojure


【解决方案1】:

Clojure 有表单,因为它是 Lisp

  • Clojure form 是一个元素或数据结构,作为 一个程序。
  • Clojure 和其他 Lisp 具有这种意义上的形式。
  • 除了 Lisps 之外,大多数编程语言都不会:结构 用于组成程序结构的东西与原生数据完全不同 结构。
  • 函数式语言也不例外。例如,看 ML家人。

evaluation 的规则告诉您表单是如何工作的。

  • 使用原生数据结构表达程序的好处 结构是您可以编写几乎可以操作表单的程序 就像您可以编写任何其他类型一样容易。
  • 此类程序称为macros

例如,看看the source for and。你不能在 Java 中做到这一点。


This 总体上回答了您对 Lisps 的问题。

【讨论】:

  • 我不太明白。你是说表格就是数据?或者文字可能是?
  • @AmanuelNega 而不是修补这个答案,我有 another go 解释此事。不要沉迷于这个问题。只要玩弄语言,你的洞察力就会增长。
【解决方案2】:

clojure 表单是数据还是类型?

-数据

Clojure 表单是一段被视为数据的代码。

Clojure 形式具有化学性质。 元素类似于

  • 数字(423.141622/7
  • 字符串 ("1, 2, buckle my shoe.")
  • 符号 (a5, freds-white-teeth),无论它们表示什么。

分子类似于

  • 表达式((+ 1 1)(reduce * (range 1 n))
  • 参数列表([f coll][[forename surname :as name]]

用于将分子形式绑定在一起的唯一结构是 Clojure 自己的数据结构。这就是 code as data 的含义。

Clojure 用途

  • 表达式列表;
  • 参数列表的向量(以及一般的绑定形式);
  • (关联绑定表单的映射)。

    (暂时保留这些)。

在顶层,我们通常有defdefn 表单。这些可以很深。

  • def 是一种特殊形式。它有自己的评估规则。
  • defn 看起来像一个特殊的形式,其实不是。

因为 Clojure 程序是作为 Clojure 数据编写的,所以我们可以编写函数

  • 将表单作为参数并
  • 返回表单结果。

拼图的最后一部分是 Clojure 提供了一种特殊的函数模式,称为 ,它

  • 以表单形式对其参数进行操作
  • 将调用表单转换为表单结果。

结果证明这是一种强大的机制。例如,defn 是一个将fn 表单包装在def 表单内的宏。一个廉价而愉快的类似物是

(defmacro my-defn [name & args-and-body]
  (list 'def name (cons 'fn (cons name args-and-body))))

真正的defn 要复杂得多。不过这个就足够应付了

(my-defn twice [n] (* 2 n))

(twice 3)
;6

我们可以通过做来看看发生了什么

(macroexpand '(my-defn twice [n] (* 2 n)))
;(def twice (fn twice [n] (* 2 n)))

我们甚至可以定义递归函数:

(my-defn fact [n]
  (if (pos? n)
    (* n (fact (dec n)))
    1))

(map fact (range 1 5))
;(1 2 6 24)

  • 以上内容适用于任何 Lisp,不仅适用于 Clojure。
  • 其他 Lisps 仅使用列表来构建表单。
  • 没有其他重要的语言具有 code as data 属性。
  • 函数式语言也不例外:ML 系列(ML、OCaml、 Haskell、F#、...) 具有相当传统的语法。

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多