下面这行代码在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为函数式语言,类属于一种“说明式”语言的分
类。说明式语言面向“程序=算法+结构”中对“算法”的解释。而我们常用的
面向对象、面向过程的高级语言,则类属于一种“命令式”语言,侧重于对“结
构”作出解释。
分享到:
相关推荐
许多高校将Scheme作为教学语言之一,帮助学生理解高级编程概念。 **编程特色归纳:** 1. **词法定界(Lexical Scoping):** Scheme采用词法定界规则,这意味着变量的作用域是由其在源代码中的位置决定的。这种机制...
《Teach Yourself Scheme in Fixnum Days》是一本关于Scheme编程语言的自学教程,本书内容涵盖了从基础到高级的多个知识点,致力于让读者在有限的天数内掌握Scheme编程。在进行知识点梳理之前,我们先对文档内容进行...
《MIT-Scheme源代码解析与应用》 MIT-Scheme是一个基于Lisp方言的解释器,由麻省理工学院(MIT)开发,广泛用于教学、研究和软件开发。它以其高效、简洁和高度可扩展性而著称。源代码的提供为开发者提供了深入理解...
6. **条件(Cond)**:一种多分支选择结构,如`(cond (条件1 表达式1) (条件2 表达式2) ...)`。 7. **赋值(Set!)**:用于改变已定义变量的值,如`(set! 变量名 新值)`。 在C#中实现Scheme解释器,我们需要以下几...
1. **“Showing off Scheme”** - 本章通过一系列示例介绍了Scheme的基本功能,包括如何与Scheme交互、如何从输入错误中恢复以及退出Scheme环境等基础知识。此外,还通过具体的例子(如生成缩写词、翻译成Pig Latin...
本书第四版提供了对Scheme编程语言全面的介绍,包含了语言的语法、命名约定、排版和符号约定、交互方式、表达式的评估、变量和let表达式、lambda表达式、顶层定义、条件表达式、简单递归、赋值等基础知识。...
- **Quoting**(引用):在Scheme中,引用允许将一个表达式作为数据而不是代码来处理。 以上只是对MIT Scheme参考手册部分内容的简要分析,手册还包括更多关于数值、字符、字符串、列表、向量、位串、杂项数据类型...
scheme源代码scheme 阴阳题源代码
Scheme-Lib是一个专门为Scheme编程语言设计的库,特别针对Android平台进行了优化和适配。Scheme是一种历史悠久、功能强大的Lisp方言,以其简洁的语法和强大的函数式编程特性著称。在Android平台上使用Scheme-Lib,...
Fluent Scheme 中文手册修订 Fluent Scheme 是一种基于 ...Fluent Scheme 中文手册修订为用户提供了一个详细的编程指南,涵盖了 Fluent Scheme 的基本概念、接口机制、变量类型、数学函数、控制结构等方面的知识点。
- **列表(Lists)**:列表是Scheme中非常重要的数据结构之一,可用于存储多个值。列表操作是Scheme的一个强大特性,可以通过多种方式创建、修改和遍历列表。 - **条件语句(if)**:`if`语句用于根据条件执行不同的代码...
例如,我们可以创建一个名为`myapp`的scheme: ```xml <activity android:name=".MyCustomActivity"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category...
总之,多项式反统一算法在Scheme中的实现涉及到对表达式结构的理解、变量和常量的处理、运算符的规则定义以及递归处理。通过这样的实现,我们可以构建一个能够处理复杂数学表达式推理的工具,这对于逻辑编程和自动...
变量和`let`表达式章节介绍了局部作用域的概念,`let`允许在特定范围内绑定变量并执行代码块。`lambda`表达式是函数定义的关键,它允许创建匿名函数,增强了代码的灵活性。最后,`top-level definitions`即顶级定义...
Scheme是一种基于Lisp家族的函数式编程语言,它以其简洁的语法和强大的抽象能力而闻名。作为一门编程语言,Scheme是学习函数式编程思想的理想选择,尤其适合初学者入门。以下是一些关于Scheme编程的重要知识点: 1....