6.4 字、词、参、名、料、文
对名语言来说,语言构成的最基本单位称之为“字”(Character),多个字连在一块可以构成“词”(Symbol)或“诗”。
> (字? #\a) #t
> (字? #\+) #t
> (字? #\梨) #t
> (词? '一只梨) #t
> (词参? '#:一只梨) #t
> (诗? "一只梨") #t
> (词->诗 '春分,夏至,秋分,冬至。) "春分,夏至,秋分,冬至。"
> (词参->诗 '#:春分,夏至,秋分,冬至。) "春分,夏至,秋分,冬至。"
> (诗->词 "春分,夏至,秋分,冬至。") '春分,夏至,秋分,冬至。
> (诗->词参 "春分,夏至,秋分,冬至。") '#:春分,夏至,秋分,冬至。
> (诗->链 "半个苹果") '(#\半 #\个 #\苹 #\果)
> (名? #'半个苹果) #t
对名语言(LISP)来说,“词”和“链”是比较特殊的两种数据结构,因为这两者是名语言代码在“文”(syntax object)层面上所使用到的数据结构。
什么是“文”呢?简单而言,一段名语言的代码就是“文”。
对于其他很多编程语言来说,代码就是简单意义上的代码,但对名语言(LISP语言)来说,一段代码必须以某种形式的可以在代码中被表示出来(以便被操作,用代码来生成代码),这种在代码中另外被表示着的一段代码我们称之为“文”。
细究的话,“文”通常由两种要素组成:“具体的代码”和“具体代码的上下文环境”(包括代码在文件的第几行第几列、作用域等等)。
> (求 (料->文 #f '(+ a b c))) a: undefined;
cannot reference an identifier before its definition
in module: top-level
> (文 (+ 1 2 3)) #<syntax:eval:2:0 (+ 1 2 3)>
> (求 (料->文 #f '(+ 1 2 3))) 6
; > (文 一个香梨) #<syntax:eval:4:0 一个香梨>
> (文 '一个香梨) #<syntax:eval:5:0 (quote 一个香梨)>
> (文 "一个香梨") #<syntax:eval:6:0 "一个香梨">
; > (文->料 #'(1 2 3)) '(1 2 3)
> (文->链 #'(1 2 3)) '(#<syntax:eval:8:0 1> #<syntax:eval:8:0 2> #<syntax:eval:8:0 3>)
; > (料->文 #f 1) #<syntax 1>
> (料->文 #f '一个香梨) #<syntax 一个香梨>
> (料->文 #f '(1 2 3)) #<syntax (1 2 3)>
汉化
汉化
汉化
汉化
汉化
词->诗 : = symbol->string
汉化
诗->词 : = string->symbol
汉化
诗->词参 : = string->keyword
汉化
词参->诗 : = keyword->string
汉化
汉化
汉化
名? : = identifier?
汉化
文->料 : = syntax->datum
汉化
文->链 : = syntax->list
汉化
料->文 : = datum->syntax