- 主题: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.*