作者kennyluck (Kenny)
看板Math
标题Re: [转录][新闻] 30÷2(2+3)÷5是多少? 计算机딠…
时间Thu May 5 01:51:57 2011
抱歉 直接回一个古文
不过这篇文章的重点就是讲一下一个很接近数学的程式语言 Fortress 中
「空白」运算子(juxtaposition)的优先顺序问题
※ 引述《CloudyWing (孤单ㄉ翼)》之铭言:
: 前提2:省略乘号是否定义拥有优先权
: 前面有一位前辈有说部分教科书有说明省略乘号优先权为优先,但非是世界通用规则
: 也就是这是实际上没有定义的东西,但部分教科书编辑者却将自己的认知编辑进去
: 这种情况应该是那些教科书编辑错误...
: 至少在"省略乘号拥有优先权"确实被定义出来前,省略乘号是没有优先权
不太同意这句话
有教科书说「省略乘号优先权为优先」不一定代表不写这句话就是
「至少在"省略乘号拥有优先权"确实被定义出来前,省略乘号是没有优先权」吧
: 不如用念力来请求哪位数学系高手中之高高手来去翻原始定义引经据典替大家解答(咦!?)
不好意思继续 po 文烦版友 毕竟这真的不是一个数学问题
好啦 进入主题
不过我也不是研究 programming language 的 只是刚好有去听过这个语言的演讲
Fortress 是由发明 Scheme 还有写出 JavaScript、Java 第一版规范的 Guy Steele
跟他在 Sun 的团队做出来的一个很接近数学的程式语言
http://en.wikipedia.org/wiki/Fortress_%28programming_language%29
其中最大的特色是可以用非 ASCII 的符号写程式 比如说:
这些算式都是合法的 u · (v × w) 或是 (a + b) ∪ c 算子随便你 overload
当然有 2(3+4) 之类的东西 另外还有:
f(x) = x^2 + sin(x) + cos(2x) 可以简写成 f(x) = x^2 + sin x + cos 2 x
(不能把 2 x 变成 2x)
f(x) = sin(sin(x)) 可以解写成 f(x) = sin sin x
(也就是有部份 right-associative!!)
if A ⊆B = C ⊂D then ... end (这叫做 chained operator)
它内建一个程式码到LaTex 的转换器 不过我不太不晓得涵盖情形怎麽样
回到原来的问题跟他的变形 Fortress的执行状况如下:
6÷2(1+2) = 6/2(1+2) = 6 ÷ 2 (1+2) = 1
6÷2 (1+2)
(语法错误)
6/2 (1+2) = 6/2 (1+2) = 9
解释一下这个结果 根据 Fortress 规范 (
http://bit.ly/lMtMer ) 16.2
跟这几个式子有关运算子的顺序如下:
1. tight juxtaposition — 没有空白的「空白」运算子 (如:2(1+2))
2. tight fractions — 没有空白的'/'
3. loose juxtaposition — 有空白的「空白」运算子 (如:2 (1+2),sin x,2 3)
4. ÷
5. +
(对於为什麽「6÷2 (1+2)」是语法错误有兴趣的请看规范)
这说明了几件事:
- 真的有「空白」运算子这种东西 八卦版Zmittermeyer的还蛮厉害的 xdd (
#1DmEi-IU)
只是「空白」运算子根据 type 有时候还会是 function application
- 「÷」跟「/」可以不一样
- 「6/2 (1+2)」 这个问题(八卦版
#1DmDoM4e 推文) 靠把「空白」运算子
分成两个也解决了
- 「语法错误」也是一招 只是在这个版说这个不知道会不会被当成是「不想讨论」
- Mathematica 用了另一套 Fortress 用了这一套
这说明了这真的不是一个数学问题 而是设计问题 要什麽有什麽
而设计问题就是使用者最大 而真正的使用者不包含会需要去算「6÷2(1+2)」的人
(因为这是一个假问题)
而是那些看着论文上的分式去打计算机的人
「需不需要为了省打一次夸号而引入这套复杂演算法」才是问题所在
(因为使用者也可能会忘掉打夸号)
所以我上一篇才说需要做 usability study (其实数学版可以办一个投票)
最後 再出一题好了
请问 「2+3 - 4+2」 是多少?
1) 3
2) -1
3) (语法错误)
Fortress的答案是 3) 就跟 sin x+y 一样
没关系 我没什麽兴趣为这题争分数 xddd
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.43.113.25