作者yjc1 (..........)
看板Python
标题Re: [资讯] Guido 对 Tail Recursion Elimination …
时间Wed Apr 29 01:29:31 2009
※ 引述《yjc1 (..........)》之铭言:
: http://neopythonic.blogspot.com/2009/04/tail-recursion-elimination.html
: 解释了这麽多年来一直没把 TRE / TCO(Tail Call Opimization) 加到 python 的原因
: 这些理由可以理解但不太能接受… 连 lua 都 support TCO 了…
http://neopythonic.blogspot.com/2009/04/final-words-on-tail-calls.html
再次确认 TCO 无望,但後半段提到的 TCO 替代方案颇有趣
看起来还是可以硬干,只是很丑……
这些理由中唯一可以说服我的只有 guido 对 stack frame 不能被破坏的坚持,
但个人感觉 stack frame 也没那麽神圣不可侵犯。
而且连放到 -O 才开的方式都冠以「破坏一致性」的大义…就死心了吧…
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.23.212
1F:→ yjc1:「To iterate is human; to recurse, divine.」 04/29 01:37
2F:→ yjc1:「递回只应天上有,凡人该当用回圈」 - L. Peter Deutsch 04/29 01:39
3F:推 ykjiang:必要用 TCO 的案例,都可以很容易用 loop 写吧, 04/29 12:11
4F:→ ykjiang:例如算阶乘等,为什麽这种东西坚持要用递回写? 04/29 12:12
5F:→ sbrhsieh:为了让 Python 更向 functional programming 靠拢? 04/29 18:09
6F:推 ykjiang:以算阶层来说,就算用 FP ,也不必用到递回 04/29 18:45
7F:→ ykjiang:reduce(lambda a, b: a+b, range(10)) 04/29 18:48
8F:→ ykjiang:f=lambda x: reduce(lambda a, b: a*b, range(1,x+1)) 04/29 18:53
9F:→ ykjiang:f(3) 04/29 18:54
10F:→ ykjiang:6 04/29 18:54
11F:推 ykjiang:我不反对递回,而是反对要动用 TCO 才跑得好的程式写法 04/29 18:57
12F:→ ykjiang:这对数学家也许很有趣,但不符合工程美学 04/29 18:58
13F:→ ykjiang:Explicit is better than implicit. 04/29 19:06
14F:→ ykjiang:Simple is better than complex. 04/29 19:06
15F:→ sbrhsieh:你有考虑 reduce 是如何实做的吗?应该是iterative作法 04/29 19:34
16F:→ sbrhsieh:loop 在 iteration 之间有额外的状态必须正确维持住 04/29 19:44
17F:→ sbrhsieh:不过我认为你以reduce实做阶层计算跟使用tail-recursion 04/29 20:01
18F:→ sbrhsieh:来实做的精神几乎一样了 04/29 20:02
19F:推 ykjiang:tail-recursion 是特定递回写法照成的现象; 04/29 21:02
20F:→ ykjiang:reduce 的背後,基本上就是 iterative ,跟递回不相干 04/29 21:04
21F:推 ykjiang:这样说好了,你手算阶乘时是怎麽算的?有简明的写法, 04/29 21:18
22F:→ ykjiang:有简单明了的写法时,为甚麽要用递回来写? 04/29 21:19
23F:→ ykjiang:我用递回的原则就是问:这样写有比较简单吗? 04/29 21:20
24F:→ ykjiang:Python 支援 TCO 的话,某种程度就是鼓励人写 TC 04/29 21:22
25F:→ ykjiang:而我看过的 TC 程式都比它的非 TC 版本来得晦暗; 04/29 21:23
26F:→ ykjiang:TC 的写法把简单的事情复杂化 04/29 21:23
27F:→ ykjiang:以上是我的观点 04/29 21:24
28F:推 godfat:对不熟悉递回的人而言递回是不好懂;反之是很单纯又直觉的 04/29 21:25
29F:→ ykjiang:There should be one 04/29 21:26
30F:→ ykjiang:-- and preferably only one --obvious way to do it. 04/29 21:27
31F:→ ykjiang:quicksort 以递回写就比较简明;乘阶以递回写比较晦暗 04/29 21:34
32F:→ poga:我倒觉得用递回写factorial一点都不晦暗... 04/29 23:18
33F:→ yjc1:照 yk 的说法,那 list comprehension 与 lambda 也不应该加 04/30 00:00
34F:→ yjc1:入 python 当中 04/30 00:00
35F:→ yjc1:lambda 不够直觉, list comprehension 不够 explicit 04/30 00:02
36F:→ yjc1:但这两项暨没有破坏 stack frame 也无破坏一致性的问题,所以 04/30 00:04
37F:→ yjc1:我才说可以接受 guido 这样的说法 04/30 00:04
38F:→ yjc1:另外,递回只是种工具,有其适合的场合与不适用的场合 04/30 00:10
39F:→ yjc1:总不能因为有人不熟 OOP 就叫他不要在c++/java里用oop吧 04/30 00:11
40F:推 Lucemia:但是python 允许使用递回、只是限制在1000层的范围内 04/30 00:29
41F:→ Lucemia:以工具使用上来用是足够的 04/30 00:32
42F:推 ykjiang:factorial 以递回写确实很明确,跟定义方式一样 :) 04/30 01:04
43F:→ ykjiang:list comprehension 提出的原因就是它较 explicit 04/30 01:05
44F:→ ykjiang:有些场合用 lambda 很方便,虽然我觉得这个 term 很无俚头 04/30 01:16
45F:→ sbrhsieh:function call 的 overhead 是不是变相不鼓励递回解? 04/30 01:25
46F:→ ykjiang:就如 L 说的,Python 还是允许大家用递回, 04/30 01:25
47F:→ ykjiang:只要不要像 TC 类造成 recursion 灾难就好... 04/30 01:27
48F:→ ykjiang:还有,就是值不值得,加了 TCO 压缩到其他功能的开发资源 04/30 01:32
49F:→ yjc1:lambda 是无俚头的 term…… TCO压缩到其他功能开发资源…… 04/30 02:35
50F:→ poga:我感受到一股Blob吊诡的味道... 04/30 03:07
51F:→ poga: Blub sorry 04/30 03:22
52F:→ ykjiang:lambda 对知道典故的人当然不会无俚头, 04/30 10:22
53F:→ ykjiang:只是觉得应该有更直觉的写法才对,虽然我不知它该是什麽 04/30 10:23
54F:推 dotZu:对於函数式程式语言的爱好者而言,lambda和递回都很直觉 04/30 15:04
55F:→ dotZu:不过 Guido 说他不是函数式程式语言的爱好者 XD 04/30 15:05
56F:推 ykjiang:lambda 名称是由 Lisp 来的,当初本来就是乱取个名字来用 05/04 12:17
57F:→ ykjiang:可以参考各种语言对相似语意的语法差异: 05/04 12:17
58F:→ ykjiang:Lisp: (lambda (arg) "hello world") 05/04 12:18
59F:→ ykjiang:Smalltalk: [arg| ^"hello world"] 05/04 12:18
60F:→ ykjiang:Ruby: 5.times {|x| puts x} 05/04 12:19
61F:→ ykjiang:大家不觉得 Smalltalk 或 Ruby 的用法比较简洁有力吗? 05/04 12:20
62F:→ poga:lambda是从lambda calculus来的吧... 05/04 21:57
63F:→ poga:不过前後关系我不知道,可能得请PLT那边的来(倒 05/04 22:01
65F:→ yjc1:好歹先翻一下相关资料再讨论吧. 05/04 23:00
66F:推 godfat:我喜欢 Haskell. \x -> x + 1. 另,ruby 用 lambda{ ... } 05/05 00:19
67F:→ ykjiang:我知道 lambda calculus 是 Church 提出来的, 05/05 21:17
68F:→ ykjiang:它跟 Lisp 的渊源是我记错了;不过没差,名字还是随意取的 05/05 21:18
69F:→ ykjiang:新的 ruby 好像有新的语法糖衣,比 lambda term 简便 05/05 21:19
70F:→ godfat:ruby 1.9 可以这样用:->x{x+1} 这是学自 perl 6 的,但 05/05 22:45
71F:→ godfat:其实很多人反对这种用法,觉得 -> 一点都不像 lambda 05/05 22:46
72F:→ godfat:我自己试试的结果是,这样写长一点时,其实是真的不好看 05/05 22:46
73F:→ ykjiang:相较於 lambda calculus ,工程师应该对 Turing Machine 05/05 23:05
74F:→ ykjiang:感到较亲切,虽然两者的计算能力是等效的 05/05 23:06
75F:→ ykjiang:不过 Turing Machine 比较像 Machine :p 05/05 23:06