反正边学边记就是了……
======================================================
标识符允许的范围:
[a-zA-Z?!*\/<=>:$%\^&_.~][a-zA-Z0-9?!.+\-*\/<=>:$%\^&_.~@]*
也就是:
小写字符a-z
大写字符A-Z
数字0-9
符号 ? ! . + - * / < = > : $ % ^ & _ ~ @
标识符开头不能为'@',一般也不以数字、'+'、'-'、'.'开头。
"+"、"-"、"..."为例外。
标识符的大小写不敏感。
------------------------------------------------------
注释标记:
';'开始直到行末是注释。
------------------------------------------------------
数据类型:
表:用成对的括号("()")括住的。可以嵌套。也称为S-expression(Symbolic expression)。
向量:("#()")括住的,例如#(this is a vector of symbols)。
字符:("#\")开头的,例如#\a。
字符串:成对的双引号之内括住的,例如"This is a string."。
数字:
--整型:123, +123, -123
--有理数:1/2
--浮点数:1.3, 1e23
--复数:1.2-2.3i(平面坐标), -1.2@73(极坐标)
布尔值:#t #f。在Scheme的条件表达式里,只有#f才被认为是假,而其它对象都被认为是真。所以3, (), "false", nil都是真。
[code](DEFINE (test a)
(COND
((EVAL a) (DISPLAY "true"))
(ELSE (DISPLAY "false"))
)
)
(test #f) ;=> false
(test ()) ;=> true[/code]
======================================================
谓词:
EQ? EQV? EQUAL? LIST? NULL?
数字谓词:
= <> < > <= >= >= EVEN? ODD? ZERO?
======================================================
表操作函数:
CAR:取表头
CDR:取表头以外剩余的部分
CONS:连接表。与CAR/CDR是相对的操作。
[code](CONS (CAR list) (CDR list)) ;=> list[/code]
APPEND:合并两个表
[code](APPEND list1 list2)
(APPEND '(a b c) '(d e f)) ;=> (a b c d e f)[/code]
======================================================
控制流/条件语句:
if语句:
[code](IF
predicate_expression
then_expression
else_expression
)[/code]
例如
[code](IF (> a b)
(- a b)
(- b a)
)[/code]
------------------------------------------------------
cond语句:
[code](COND
(predicate_1 expression_1 expression_2 ...)
(predicate_1 expression_1 expression_2 ...)
(predicate_1 expression_1 expression_2 ...)
...
(predicate_1 expression_1 expression_2 ...)
(else expression_1 expression_2 ...)
)[/code]
cond语句按照代码书写的顺序从前向后匹配谓词,然后执行第一个值为真的谓词后面的表达式。
else是可选的。实际上这里else就是一个#t值而已。
例如
[code](COND
((> a b) 1)
((= a b) 0)
((< a b) -1)
)[/code]
======================================================
lambda表达式:
[code](LAMBDA (formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
)[/code]
======================================================
quote表达式:
所有表和原子符号都会被解释器eval,为了避免某些表或原子符号被eval,则需要将其quote起来。
[code](QUOTE expression)[/code]
这个也可以被缩写为
[code]'expression[/code]
======================================================
定义常量或函数:
[code](DEFINE symbol expression)[/code]
[code](DEFINE function_name (LAMBDA (formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
))[/code]
[code](DEFINE (function_name formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
))[/code]
======================================================
let表达式:
[code](LET (
(name_1 expression_1)
(name_2 expression_2)
...
(name_n expression_n)
)
expression_1 expression_2 ..
)[/code]
======================================================
一些数值运算函数:
(SQRT a) :a的平方根
(EXPT a b) :a的b次幂
(REMAINDER a b) :a模b
(LOG a) :a的自然对数
(SIN a) :a的正弦值,其中a是弧度
======================================================
输入/输出:
[code](DISPLAY expression)[/code]
[code](NEWLINE)[/code]
======================================================
标识符允许的范围:
[a-zA-Z?!*\/<=>:$%\^&_.~][a-zA-Z0-9?!.+\-*\/<=>:$%\^&_.~@]*
也就是:
小写字符a-z
大写字符A-Z
数字0-9
符号 ? ! . + - * / < = > : $ % ^ & _ ~ @
标识符开头不能为'@',一般也不以数字、'+'、'-'、'.'开头。
"+"、"-"、"..."为例外。
标识符的大小写不敏感。
------------------------------------------------------
注释标记:
';'开始直到行末是注释。
------------------------------------------------------
数据类型:
表:用成对的括号("()")括住的。可以嵌套。也称为S-expression(Symbolic expression)。
向量:("#()")括住的,例如#(this is a vector of symbols)。
字符:("#\")开头的,例如#\a。
字符串:成对的双引号之内括住的,例如"This is a string."。
数字:
--整型:123, +123, -123
--有理数:1/2
--浮点数:1.3, 1e23
--复数:1.2-2.3i(平面坐标), -1.2@73(极坐标)
布尔值:#t #f。在Scheme的条件表达式里,只有#f才被认为是假,而其它对象都被认为是真。所以3, (), "false", nil都是真。
[code](DEFINE (test a)
(COND
((EVAL a) (DISPLAY "true"))
(ELSE (DISPLAY "false"))
)
)
(test #f) ;=> false
(test ()) ;=> true[/code]
======================================================
谓词:
EQ? EQV? EQUAL? LIST? NULL?
数字谓词:
= <> < > <= >= >= EVEN? ODD? ZERO?
======================================================
表操作函数:
CAR:取表头
CDR:取表头以外剩余的部分
CONS:连接表。与CAR/CDR是相对的操作。
[code](CONS (CAR list) (CDR list)) ;=> list[/code]
APPEND:合并两个表
[code](APPEND list1 list2)
(APPEND '(a b c) '(d e f)) ;=> (a b c d e f)[/code]
======================================================
控制流/条件语句:
if语句:
[code](IF
predicate_expression
then_expression
else_expression
)[/code]
例如
[code](IF (> a b)
(- a b)
(- b a)
)[/code]
------------------------------------------------------
cond语句:
[code](COND
(predicate_1 expression_1 expression_2 ...)
(predicate_1 expression_1 expression_2 ...)
(predicate_1 expression_1 expression_2 ...)
...
(predicate_1 expression_1 expression_2 ...)
(else expression_1 expression_2 ...)
)[/code]
cond语句按照代码书写的顺序从前向后匹配谓词,然后执行第一个值为真的谓词后面的表达式。
else是可选的。实际上这里else就是一个#t值而已。
例如
[code](COND
((> a b) 1)
((= a b) 0)
((< a b) -1)
)[/code]
======================================================
lambda表达式:
[code](LAMBDA (formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
)[/code]
======================================================
quote表达式:
所有表和原子符号都会被解释器eval,为了避免某些表或原子符号被eval,则需要将其quote起来。
[code](QUOTE expression)[/code]
这个也可以被缩写为
[code]'expression[/code]
======================================================
定义常量或函数:
[code](DEFINE symbol expression)[/code]
[code](DEFINE function_name (LAMBDA (formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
))[/code]
[code](DEFINE (function_name formal_parameter_1 formal_parameter_2 ...)
expression_1 expression_2 ...
))[/code]
======================================================
let表达式:
[code](LET (
(name_1 expression_1)
(name_2 expression_2)
...
(name_n expression_n)
)
expression_1 expression_2 ..
)[/code]
======================================================
一些数值运算函数:
(SQRT a) :a的平方根
(EXPT a b) :a的b次幂
(REMAINDER a b) :a模b
(LOG a) :a的自然对数
(SIN a) :a的正弦值,其中a是弧度
======================================================
输入/输出:
[code](DISPLAY expression)[/code]
[code](NEWLINE)[/code]