- 论坛徽章:
- 2
|
回复 54# starwing83
前面那一堆,除了const fold,还是没说出与lua的差别。
>> (define (foo a b) (+ a b))
lua里面 function(a,b) return a+b end
也只是固定了一个OP_ADD而已,也就只是知道它对两个number会数字+, 对有元表的看元表定义。 具体会做什么依然不清楚。
(defun foo (a b) (funcall #'+ a b))
(define foo (let ((+ +)) (lambda (a b) (+ a b))))
取出+的定义,对两个number(fixnum/bignum/real...)会数字+, 对其他无定义。 +的function cell不再影响foo函数。
>> 惟一的办法就是不允许修改这些值,那其实和lua(以及lua ast)没啥差别了。
这段,连着后面那楼
>> 说到灵活性,你能假设没有人会有需求去改变+么?也许有也许没有,照你的理论这个就得支持,不然就是“限制程序员”,我的意思是,这里面的确需要有个度。如果说只要“有可能”会用到的都要支持,那语言就很难在语义和实现上取得平衡了。
一起回复了。
有差别,而且你怎么想不到呢…… 支持了又不是说所有地方就必须都有这种灵活性……
你这等于是在说: C/C++支持指针运算,支持类型转换,没有限制程序员, 所以是不安全的。 但其实良好的C/C++程序里这些不安定因素只在很小范围内。
那个cl反汇编的例子, 没说add以外的函数中的+的行为全都被固定了啊, 也没说不允许const fold啊, 只是那个例子没有掩饰而已。
你怎么和327一样呢…… 要么C,要么C++了就必须全private…… 不是的,private也是在你需要时才用的。
>> 惟一的办法就是不允许修改这些值,那其实和lua(以及lua ast)没啥差别了。
lua有办法让foo函数告知编译器: 我这函数就用内建+了, a,b就只支持整数了, 给我优化到addl?
>> lua照样可以生成lua代码,而且根本不难。lisp除了语法和编译器支持以外,看不出什么优势。操作程序表只是在提取信息而不是构造程序方面有优势。然而只要有了ast,连这种优势也没了。
什么叫这种优势也没了?这也不是第一次与你说这个了: 能获得ast的语言早就有了, 为什么在元编程(code transformation)方面依然没超过lisp?
lua的宏,等它出来之后再说好吗?这只是说lua有这个能力, 并不能肯定lua能够很容易的使用这个能力。
上面的,什么使得lisp不同,貌似是第8点,特有的代码记法。 代码中写的样子就是读的样子,已经被人肉parse过了。
不仅仅是能够获得, 而且是在代码文本中能够清晰看见。 这就是被人诟病的lisp难看的语法的优势。
|
|