Scheme和Comme Lisp区别

By guenchi at 2017-12-10 • 0人收藏 • 345人看过

摘自On Lisp 


1. CommonLisp眼中,一个符号的symbol-valuesymbol-function是不一样的,而Scheme对两者不作区分。在 Scheme 里面,变量只有唯一对应的值,它可以是个函数,也可以是另一种对 象。因此,在 Scheme 中就不需要 #’ 或者 funcall 了。Common Lisp 的:            

        (let ((f #’(lambda (x) (+ x 1))))(funcall f 2))

 在 Scheme 中将变成:

        (let ((f (lambda (x) (+ x 1))))(f 2))


2. 由于 Scheme 只有一个名字空间,因而它没有必要为各个名字空间专门设置对应的赋值操作 符 (例如 defun setq)。取而代之,它使用 definedefine 的作用和 defvar 大致相当,同时 用 set! 替代了 setq。在用 set! 为全局变量赋值前,必须先用 define 创建这个变量。


3.Scheme中,通常用define定义有名函数,它行使着defundefvarCommonLisp中的功 能。Common Lisp 的:

        (defun foo (x) (+ x 1))

有两种可能的 Scheme 翻译:

        (define (foo x) (+ x 1))

        (define foo (lambda (x) (+ x 1)))


4.Common Lisp 中,函数的参数按从左到右的顺序求值。而在 Scheme 中,有意地不对求值顺序 加以规定。(并且语言的实现者对于忘记这点的人幸灾乐祸。)


5. Scheme不用tnil,相应的,它有#t#f。空列表,(),在某些实现里为真,而在另一些实现里 为假。


6. cond case 表达式里的默认子句在 Scheme 中带有 else 关键字,而不是 Common Lisp 中的 t


7. 某些内置操作符的名字被改掉了:consp成了pair?,而null则是null?mapcar(几乎)map等等。通常根据上下        文,应该能看出这些操作符的意思。


2 个回复 | 最后更新于 17 天前
17 天前   #1

Guy L. Steele Jr 对 Common Lisp 的抱怨:

In Common Lisp, why are there many namespaces (variables, functions, go tags, block names, catch tags, …) ?

17 天前   #2

回复#1 @qzivli :

登录后方可回帖

登 录
信息栏

Scheme中文社区

推荐实现 ChezScheme / r6rs / r7rs large
theschemer.org
Q群: 724577239

精华导览

社区项目

包管理器:Raven
HTTP服务器:Igropyr (希腊火)
官方插件:vscode-chez

社区目标:

完善足以使Scheme工程化和商业化的库,特别是开发极致速度的Web服务器和ANN模块。

一直以来Scheme缺少一个活跃的中文社区,同时中文资料的稀少,导致大多数因为黑客与画家和SICP而接触Scheme的朋友,在学完SICP后无事可做,不能将Scheme转换为实际的生产力。最后渐渐的放弃。
同时Chicken等实现,却因效率问题无法与其他语言竞争。本社区只有一个目的,传播Scheme的文明之火,在最快的编译器实现上,集众人之力发展出足够与其他语言竞争的社区和库。


友情链接:

Clojure 中文论坛
函数式·China


Loading...