CLISP 实现记录: 2.语法

2.1 标准字符(Standard Characters) [sec_2-1-3]

标准字符就是 #\Newline 以及用32到126之间的 CODE-CHAR 表示的字符.

2.2 读取算法(Reader Algorithm) [sec_2-2]

步骤4的需要“reader macro function 可能会返回0个值或者一个值” 是强制的. 你可以使用函数 VALUES 来控制返回值的个数.

2.3 符号作为token(Symbols as Tokens) [sec_2-3-4]

一个 reserved token , 换句话说, 一个包含潜在数字语法但是不能被解释为一个 NUMBER 的 token , 在被读入时解释为 SYMBOL .

2.4 Token的合法模式(Valid Patterns for Tokens) [sec_2-3-5]

当一个带有包标记的token被读入时,并且没有检查这个 SYMBOL-PACKAGE 部分和 SYMBOL-NAME 部分没有数字语法. (这个检查的目的会是什么呢?) 所以我们把 tokens 类似 USER:: 或者 :1 或者 LISP::4711 或者 21:3 作为符号.

2.5 反引号(Backquote) [sec_2-4-6]

这里嵌套的反引号在读取宏的时候也正常工作. 示例:

(EVAL ``(,#'(LAMBDA () ',a) ,#'(LAMBDA () ',b)))
 ≡ (EVAL `(list #'(LAMBDA () ',a) #'(LAMBDA () ',b)))
 ≡ (EVAL (list 'list (list 'function (list 'lambda nil (list 'quote a)))
                     (list 'function (list 'lambda nil (list 'quote b)))))

2.6 Sharpsign [sec_2-4-8]

读取宏也用以下方式定义:

额外的读取宏

#,

加载时的求值, 被保留了,虽然存在 [ANSI CL standard] 问题 SHARP-COMMA-CONFUSION:REMOVE.

#Y

编译后的 FUNCTION 对象还有输入 STREAM的 EXT:ENCODINGs

#”“

PATHNAME: #"test.lisp" 是 (PATHNAME "test.lisp" 的值

2.6.1 Sharpsign 反斜线字符 [sec_2-4-8-1]

#\Code 允许输入任意代码: 比如, #\Code231 读取到 (CODE-CHAR 231).

2.6.2 Sharpsign Less-Than-Sign [sec_2-4-8-20]

这个是额外表示不能被读入的对象列表:

不可读对象

#<type ...>
    所有缺少关键字构造器的 STRUCTURE-OBJECT.

#<ARRAY type dimensions>
    所有的 ARRAY 除了 STRING, 在 *PRINT-ARRAY* 是 NIL 的情况下

#<SYSTEM-FUNCTION name>
    用C写的内置的函数

#<ADD-ON-SYSTEM-FUNCTION name>
    用C写的模块函数

#<SPECIAL-OPERATOR name>
    特殊操作符

#<COMPILED-FUNCTION name>
    编译后的函数, 如果 CUSTOM:*PRINT-CLOSURE* 是 NIL

#<FUNCTION name ...>
    解释的函数 ,如果 CUSTOM:*PRINT-CLOSURE* 是 NIL

#<FRAME-POINTER #x...>
    指向栈边界的指针

#<DISABLED POINTER>
    从对应的  BLOCK 或者 TAGBODY 退出就变为无效的边界指针

#<...STREAM...>
    STREAM

#<PACKAGE name>
    PACKAGE

#<HASH-TABLE #x...>
    HASH-TABLE, 如果 *PRINT-ARRAY* 是 NIL 的话

#<READTABLE #x...>
    READTABLE

#<SYMBOL-MACRO form>
    SYMBOL-MACRO

#<MACRO function>
    macro expander (被 DEFMACRO 和friends定义的)

#<FFI:FOREIGN-POINTER #x...>
    外部指针 (平台依赖: 仅限 UNIX, Win32.)

#<FFI:FOREIGN-ADDRESS #x...>
    外部地址 (平台依赖: 仅限 UNIX, Win32.)

#<FFI:FOREIGN-VARIABLE name #x...>
    外部变量 (平台依赖: 仅限 UNIX, Win32.)

#<FFI:FOREIGN-FUNCTION name #x...>
    外部函数 (平台依赖: 仅限 UNIX, Win32.)

#<UNBOUND>
    一个没绑定符号或没提供的选项或关键字参数的“value”

#<SPECIAL REFERENCE>
    用 SPECIAL 声明的环境标识

#<DOT>
    内部的 “.”读取结果

#<END OF FILE>
    当到达 end-of-stream  时,这是内部的读取结果

#<READ-LABEL ...>
    #n# 的中间读取结果

#<ADDRESS #x...>
    不应该出现的机器地址

#<SYSTEM-POINTER #x...>
    不应该出现的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值