Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
clojure表单是数据还是类型?_Clojure - Fatal编程技术网

clojure表单是数据还是类型?

clojure表单是数据还是类型?,clojure,Clojure,我开始学习clojure。主要来自Java和一些脚本语言,作为clojure(我认为是所有函数式语言)数据部分的代码并不那么清晰 从书的第一页开始,我看到了表格。我认为它主要与数据相关,比如{12}。但在其他一些地方,我看到Boolean标记为form 现在,我假设false是类型Boolean的一种形式,但是我没有看到type被多次提及,所以我感到困惑 有人能帮我理解表单的概念吗?还有人能帮我理解作为语言数据部分的代码吗?Clojure有表单,因为它是一种语言 Clojure表单是作为表单的

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

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

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


有人能帮我理解表单的概念吗?还有人能帮我理解作为语言数据部分的代码吗?

Clojure有表单,因为它是一种语言

  • Clojure表单是作为表单的一部分呈现的元素或数据结构 节目
  • Clojure和其他Lisp都有这种形式
  • 除了Lisps之外,大多数编程语言都没有:结构 用于编写程序结构的数据与本机数据完全不同 结构
  • 函数式语言也不例外。例如,看看 家庭
表单的规则告诉您表单是如何工作的

  • 使用本机数据结构表示程序的回报 结构就是您可以编写几乎可以操纵表单的程序 就像你能写任何其他类型的一样容易
  • 这样的程序称为
例如,看一看。在Java中不能这样做


一般来说,用Lisps回答您的问题

clojure表单是数据还是类型

-资料

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

Clojure形式具有化学性质。元素是这样的

  • 编号(
    42
    3.1416
    22/7
  • 字符串(
    “1,2,扣上我的鞋。”
  • 符号(
    a5
    freds white Doots
    ),无论它们表示什么
分子是这样的

  • 表达式(
    (+11)
    (reduce*(范围1n))
  • 参数列表(
    [f coll]
    [[forename name:as name]]
用于将分子形式绑定在一起的唯一结构是Clojure自己的数据结构。这就是代码作为数据的含义

Clojure使用

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

    (暂时把这些留下)

在顶层,我们通常有
def
defn
表单。这些可能有很多层

  • 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
  • 其他Lisp仅使用列表构造表单
  • 没有其他重要语言将代码作为数据属性
  • 函数式语言也不例外:ML系列(ML、OCaml、, Haskell,F#,…)有相当传统的语法

我不太明白可能的副本。你是说形式就是数据吗?或者是字面意思?@AmanuelNega我不是在修改这个答案,而是在解释这个问题。不要被这个问题困扰。只要玩弄语言,你的洞察力就会增长。