On this page:
字?
词?
词参?
词参<?
词->诗
诗->词
诗->词参
词参->诗
文?
名?
文->料
文->链
料->文
8.6

6.4 字、词、参、名、料、文

请注意,这里说的“词”(另有“”)是一种数据结构,和类似。

对名语言来说,语言构成的最基本单位称之为“字”(Character),多个字连在一块可以构成“词”(Symbol)或“”。

Examples:
> (字? #\a)

#t

> (字? #\+)

#t

> (字? #\梨)

#t

> (词? '一只梨)

#t

> (词参? '#:一只梨)

#t

> (诗? "一只梨")

#t

> (词->诗 '春分,夏至,秋分,冬至。)

"春分,夏至,秋分,冬至。"

> (词参->诗 '#:春分,夏至,秋分,冬至。)

"春分,夏至,秋分,冬至。"

> (诗->词 "春分,夏至,秋分,冬至。")

'春分,夏至,秋分,冬至。

> (诗->词参 "春分,夏至,秋分,冬至。")

'#:春分,夏至,秋分,冬至。

> (诗->链 "半个苹果")

'(#\半 #\个 #\苹 #\果)

> (名? #'半个苹果)

#t

对名语言(LISP)来说,“词”和“链”是比较特殊的两种数据结构,因为这两者是名语言代码在“文”(syntax object)层面上所使用到的数据结构。

什么是“文”呢?简单而言,一段名语言的代码就是“文”。

对于其他很多编程语言来说,代码就是简单意义上的代码,但对名语言(LISP语言)来说,一段代码必须以某种形式的可以在代码中被表示出来(以便被操作,用代码来生成代码),这种在代码中另外被表示着的一段代码我们称之为“文”。

细究的话,“文”通常由两种要素组成:“具体的代码”和“具体代码的上下文环境”(包括代码在文件的第几行第几列、作用域等等)。

对名语言来说,“具体代码”我们称之为“料”(原料、资料的意思,英文datum)。通常情况下,“料”所使用的数据结构是由“词”所组成的“链”,而由“词”所组成的“链”附加上上下文环境就可以被转化成“文”了:

Examples:
> (词? '+)

#t

> (词? 'a)

#t

> (料->文 #f '(+ a b c))

#<syntax (+ a b c)>

比如上面示例中,我们把一个“链”转化成“文”(附加的上下文环境是#f)。

但如果求这个“文”的话,会报错,原因是这个“文”的上下文环境(#f)中没有定义abc

Examples:
> ( (料->文 #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)>

汉化

字? :  = char?

汉化

词? :  = symbol?

汉化

词参? : 因与词类似,但是却主要是定义例程使用参数时才使用的。 = keyword?

汉化

词参<? :  = keyword<?

汉化

词->诗 :  = symbol->string

汉化

诗->词 :  = string->symbol

汉化

诗->词参 :  = string->keyword

汉化

词参->诗 :  = keyword->string

汉化

 :  = syntax

汉化

文? :  = syntax?

汉化

名? :  = identifier?

汉化

文->料 :  = syntax->datum

汉化

文->链 :  = syntax->list

汉化

料->文 :  = datum->syntax