从表达式到变量:一行scheme代码之所见
2007-02-12 09:56
465 查看
下面这行代码在scheme中是可以执行的,其结果值为12:
-----------
((if #f + *) 3 4)
-----------
在scheme中,一对括号表明过程调用。括号中的第一个参数是过程名,其余
的则是过程参数。
那么,我们先看内层括号中的代码:
-----------
(if #f + *)
-----------
"if"是一个过程名,而不是语句。该过程相当于JavaScript或C中的三元表
达式,或者其它语言中的一个if语句(的效果)。试以javascript来描述它
的效果(以下语句中的字符串定义,只是语义上的含义,并不表明它是字符
串):
-----------
var q = '#f';
var v1 = '+';
var v2 = '*';
( q ? v1 : v2 );
-----------
或以pascal来描述它的效果:
-----------
function _if(b: boolean; v1, v2: TSymbol): TSymbol;
begin
if ( b ) then
return v1
else
return v2;
end;
var
q : boolean = false;
v1 : TSymbol = '+';
v2 : TSymbol = '*';
_if(q, v1, v2);
-----------
在上面的例子中,+和*被都只能被记为字符的原因在于:JavaScript和pascal都
将运算符理解为语法符号,而scheme将它们理解为内置过程(procedure)。而过
程是一段代码,因此是有存储地址的。有存储地址则可以被理解为变量。
也就是说,scheme中的运算符是程序代码可以理解的“变量”。而常见的高级语
言中的运算符是由解释器或编译器理解的。
scheme中的()表明执行一个过程(或通常含义上的函数)。由于运算符被理解为
内置过程,语句谓词也能被理解为内置过程……而通常我们对语言的理解是:运
算符、表达式、语句和变量(以及常量)。因此一个重要的结论是:
-所有的语法元素都可以被理解为“过程调用”。
所以
-----------
(if #f + *)
-----------
这个代码片断的运算效果,在scheme中只需要表达为一个内置过程的调用,则其
它的一些语言则必须用三元表达式、语句、函数调用来表达它。——更何况他们
不能将“运算符”理解为“变量”。
在上面的代码中,内层的调用返回一个运算符(#f是值false,因此返回*),因此
外层的代码变成了:
-----------
(* 3 4)
-----------
这样就变成了对过程*的调用,亦即是乘法运算。结果是3*4=12。
在上面的代码分析中,我们看到了“函数式语言”的一些根本性的东西:
-语句可以被理解为过程(函数)调用的效果;
-运算符也可以被理解为过程(函数)调用的效果;
-运算符与语句(谓词)既然可以被理解为过程,则它可以被理解为(有存储
地址的)变量。
由于语言的所有语义元素都可以被理解为变量(或数据的存储地址),而且它们
的都可以被理解为“( )”这个符号(过程调用)的运算效果。因此,scheme用
“运算”和“变量”两个概念完全地概括了所有代码。它的代码只有一个含义:
-----------
(symbol)
-----------
最后再罗嗦一点:我们称scheme为函数式语言,类属于一种“说明式”语言的分
类。说明式语言面向“程序=算法+结构”中对“算法”的解释。而我们常用的
面向对象、面向过程的高级语言,则类属于一种“命令式”语言,侧重于对“结
构”作出解释。
-----------
((if #f + *) 3 4)
-----------
在scheme中,一对括号表明过程调用。括号中的第一个参数是过程名,其余
的则是过程参数。
那么,我们先看内层括号中的代码:
-----------
(if #f + *)
-----------
"if"是一个过程名,而不是语句。该过程相当于JavaScript或C中的三元表
达式,或者其它语言中的一个if语句(的效果)。试以javascript来描述它
的效果(以下语句中的字符串定义,只是语义上的含义,并不表明它是字符
串):
-----------
var q = '#f';
var v1 = '+';
var v2 = '*';
( q ? v1 : v2 );
-----------
或以pascal来描述它的效果:
-----------
function _if(b: boolean; v1, v2: TSymbol): TSymbol;
begin
if ( b ) then
return v1
else
return v2;
end;
var
q : boolean = false;
v1 : TSymbol = '+';
v2 : TSymbol = '*';
_if(q, v1, v2);
-----------
在上面的例子中,+和*被都只能被记为字符的原因在于:JavaScript和pascal都
将运算符理解为语法符号,而scheme将它们理解为内置过程(procedure)。而过
程是一段代码,因此是有存储地址的。有存储地址则可以被理解为变量。
也就是说,scheme中的运算符是程序代码可以理解的“变量”。而常见的高级语
言中的运算符是由解释器或编译器理解的。
scheme中的()表明执行一个过程(或通常含义上的函数)。由于运算符被理解为
内置过程,语句谓词也能被理解为内置过程……而通常我们对语言的理解是:运
算符、表达式、语句和变量(以及常量)。因此一个重要的结论是:
-所有的语法元素都可以被理解为“过程调用”。
所以
-----------
(if #f + *)
-----------
这个代码片断的运算效果,在scheme中只需要表达为一个内置过程的调用,则其
它的一些语言则必须用三元表达式、语句、函数调用来表达它。——更何况他们
不能将“运算符”理解为“变量”。
在上面的代码中,内层的调用返回一个运算符(#f是值false,因此返回*),因此
外层的代码变成了:
-----------
(* 3 4)
-----------
这样就变成了对过程*的调用,亦即是乘法运算。结果是3*4=12。
在上面的代码分析中,我们看到了“函数式语言”的一些根本性的东西:
-语句可以被理解为过程(函数)调用的效果;
-运算符也可以被理解为过程(函数)调用的效果;
-运算符与语句(谓词)既然可以被理解为过程,则它可以被理解为(有存储
地址的)变量。
由于语言的所有语义元素都可以被理解为变量(或数据的存储地址),而且它们
的都可以被理解为“( )”这个符号(过程调用)的运算效果。因此,scheme用
“运算”和“变量”两个概念完全地概括了所有代码。它的代码只有一个含义:
-----------
(symbol)
-----------
最后再罗嗦一点:我们称scheme为函数式语言,类属于一种“说明式”语言的分
类。说明式语言面向“程序=算法+结构”中对“算法”的解释。而我们常用的
面向对象、面向过程的高级语言,则类属于一种“命令式”语言,侧重于对“结
构”作出解释。
相关文章推荐
- 从表达式到变量:一行scheme代码之所见
- 从表达式到变量:一行scheme代码之所见
- 从表达式到变量:一行scheme代码之所见
- XCode调试的 Stack Trace,调试时抛出异常,定位到某一行代码,并且添加变量监视
- Linux下程式开发2 变量数据类型的代码以及编译&运算符与表达式
- 代码的缩进、方法的命名、文字常量、成员变量、一行不超过80个字符
- Java一行代码可声明多个同类变量
- 由于线程停在某个无法进行垃圾回收的点(可能是因为已对代码进行了优化),因此无法计算表达式的值
- 设计算法并写出代码移除字符串中重复的字符,不能使用额外的缓存空间。注意: 可以使用额外的一个或两个变量,但不允许额外再开一个数组拷贝。
- XCode的 Stack Trace,调试时抛出异常,定位到某一行代码
- C编译器剖析_5.4.1 中间代码生成与优化_删除无用的临时变量和优化跳转目标
- 一行代码起动全屏
- 一行jQuery代码搞定checkbox 全选和全不选
- vi批量转换“{”结尾的代码风格到“{”另起一行的代码风格
- 正则表达式中要用到变量,怎样写?
- 让sublime一行显示更多代码出现横向的滚动条,以及修改默认tab键长度
- PHP语句【变量、运算符表达式、语句】
- Validform:一行代码搞定整站的表单验证!
- 一行神奇的javascript代码