- 主题:Lisp/Scheme没有return语句,你们怎么能忍受的?
scheme 有 call-with-current-continuation,剩下的就是库可以实现的语法糖了。这个长名字在很多 lisp 方言中叫 call/cc。
而lisp的一个特点就是宏和自定义语法满天飞,语法糖到处是,方言千奇百怪。
去学一下 call/cc,然后你可以定义自己的 return 语句。——其实是发现用另一种思路完成类似的效果。
命令式编程和函数式编程各自有自己的背景和语义,互不熟悉很正常。像 call/cc 就是 lambda 演算下的一个特殊变换,是可以用纯函数式编程概念解释的。而类似的,return 语句在命令式编程下语义是栈操作和 goto,也不是人人熟悉的。
【 在 zhangxp024 的大作中提到: 】
: 玩racket也有好几年了,racket库比较全,从gui到web各种....
:
: 写着写着,发现racket,sbcl,clojure.... 没有return语句,只能在函数的最后一条一句返回。
: ...................
--
修改:milksea FROM 114.249.235.*
FROM 114.249.235.*
过说回来,call/cc 在函数式编程里算高级内容。因为确实你提到的诸如在 while 里返回会用别的方式写。比如在表中查找,那肯定是写一个 find 函数传入一个谓词然后递归遍历表完成,用不上循环和break。
要说 scheme 也支持副作用状态和 do 语句,但不方便;这就跟说支持函数式风格的 c++ 写个 letrec 也各种别扭一样,对吧。
如果单纯是因为
if (p) return x;
a; b; c; return y;
比
(if p x (begin a b c y))
来得省心,那确实得想想为什么要有那么多非函数式的顺序结构出现了。
【 在 zhangxp024 的大作中提到: 】
: 玩racket也有好几年了,racket库比较全,从gui到web各种....
:
: 写着写着,发现racket,sbcl,clojure.... 没有return语句,只能在函数的最后一条一句返回。
: ...................
--
修改:milksea FROM 114.249.235.*
FROM 114.249.235.*