EDN中'$ % &'之类的符号有什么用途?

ppp*_*878 0 clojure edn

我是 EDN 的新手,正在浏览 EDN 规范 - https://github.com/edn-format/edn

'$ % &' 之类的 EDN 符号有什么用?在 Clojure 中阅读 EDN 时如何使用它们?

Did*_* A. 6

规范提到了符号,但它们并不意味着键盘上的内容被称为符号。

它有点令人困惑,所以让我重新定义它。在键盘上,例如,有人可能会说,有符号,而那些会@#$%^&,等等。让我们称之为这些字符符号。

现在在 EDN 中,您有符号,但它不是指字符符号。它指的是一种数据类型。更令人困惑的是,它提到一个 EDN Symbol 可以包含一组特定的字符符号,但它不是字符符号。

那么什么是 EDN 符号?这里有一些:

hello
abc
+
person/name
this$is#insane
Run Code Online (Sandbox Code Playgroud)

这些中的每一个都是有效的 EDN 符号。对比它们有助于理解它们。所以这里有一堆 EDN 字符串:

"hello"
"abc"
"+"
"person/name"
"this$is#insane"
Run Code Online (Sandbox Code Playgroud)

这是一堆 EDN 关键字:

:hello
:abc
:+
:person/name
:this$is#insane
Run Code Online (Sandbox Code Playgroud)

那么这些有什么区别呢?嗯,你看,EDN 符号、字符串和关键字都只是一组字符,取决于它是符号、字符串还是关键字,允许的字符不同,例如,这就是为什么 EDN 规范说一个符号可以包含某些$和 等字符?。但它没有提到所有字符,例如:^不允许在符号中,但在字符串中:

hello^john ; Not a valid EDN symbol
"hello^john" ; A valid EDN string
Run Code Online (Sandbox Code Playgroud)

还有什么,您可以看到 EDN 字符串必须包含括在左双引号和右双引号之间的字符集""。另一方面,关键字必须具有以冒号开头的字符集:。并且一个符号不需要任何标记,任何连续的有效字符集都是一个符号,只要它们不:以双引号开头或用双引号括起来。

现在要了解的第二件事是……它们是做什么用的?这个比较模糊。当您将数据建模为 EDN 时,它们适用于您想要使用它们的任何目的。您可以改用 EDN 字符串或 EDN 关键字,反之亦然。每当您有一组仅包含允许的符号字符的字符时,您都可以选择使用符号在 EDN 中表示它们。

通常,人们使用关键字作为地图的键或标记,例如说动物的类型是:monkey

{:animal-type :monkey}
Run Code Online (Sandbox Code Playgroud)

通常,字符串用于表示自由格式的文本。用户输入的或需要显示给用户的文本。

{:animal-type :monkey
 :animal-name "Bruno the monkey"}
Run Code Online (Sandbox Code Playgroud)

最后,符号通常用于引用语言本身内的其他对象。比如引用一个函数,另一个数据等。

{:animal-type :monkey
 :animal-name "Bruno the monkey"
 :transform-fn animal/add-owner-info}
Run Code Online (Sandbox Code Playgroud)