- 论坛徽章:
- 2
|
starwing83 发表于 2012-02-17 16:02 ![]()
关于“虚假”么,你就当是一个找到信仰的人嫉妒比自己信仰更好的东西好了。
其实我也纠结lisp啊,我肯定知道lisp好要不然我跟你纠结这么多干嘛= =
学了el/cl/scheme/clojure还研究过各种乱七八糟的lisp后发现一个能打的都没有转而去学haskell的苦逼……
嫉妒个锤子…… 我也无限纠结的好吗……
当然这里面有一些个人喜好因素在里面。。。
比如如果抛弃对OO与Java的反感,clojure应该还是很有前途的而且很practical的……
如果放弃从C,C++养成的遵守标准的强迫症,只专注于某种cl/scheme也应该能找到满意的……
starwing83 发表于 2012-02-17 16:02 ![]()
虚假我的真正含义是,比如说吧,C++里面的多态,那个行为是一致的,而不同只是不同子类的实现,而“虚函数派发”这种事儿就是固定的一致的。而lisp呢,它看上去是一致的,但是实际上连类似”虚函数派发“这种事情都不是一致的。有的直接执行cons(tiny-scheme),有的翻译bc(racket),有的两者都有(emacs-lisp),所以………………
当然你可以说这是实现问题。但是你难道不觉得这根本就是把事情丢给了实现,才造成各种实现都有的尴尬境地么。
对于运行时不能改变bc,你告诉过我有些lisp是有的。
被C/C++侵染过的程序员……应该对unspecified……implementation defined什么的很敏感才对……
- int f(int x, int y) {
- int xx = x*x;
- int yy = y*y;
- int a = xx+yy;
- return a;
- }
复制代码 有多少个automatic duration object? C要将它的语意解释(explain)清楚,只能说有3个,不提优化不提实现不是再正常不过的事了么……
实际上你懂的,很有可能一个都没有,除非:
int g(int x, int y) {
int xx = x*x;
int yy = y*y;
int a = xx+yy;
printf("", &xx, &yy, &a);
return a;
}
但实际上很少这样写代码的……
lisp将代码的语意解释为,呃,统一的(function arg...),但实现方式只要保证满足其语意就行。
除非像上面那样,将其地址暴露给一个不知道会对该地址做什么的函数,实现就不得不真的分配变量了。
- ;el
- (let ((f '(lambda (x) (+ x 26)))) ; 注意那个quote
- (funcall f 12))
复制代码 代码已经将lambda作为数据了,编译器就不敢优化了。
也许好的实现会分析后面的代码只将它作为函数,然后编译之,但el应该不会这样。
关于后面的,先说作用域。只有一种好吗…… 只有capture by value,没有lexical与dynamic了……
而且我也想过应该有一种方法提出限制:某个表不能随意包含自由变量,比如像C++那样,要包含那些可以明确写出来,违反了就是编译错误。
capture by value以及上面这种限制,最开始其实都是为了卫生宏而考虑的……
再说心里有底。你需要的心里有底,其实还是来源于C的,+的行为是可以预料的。其实不只是lisp,C++就已经可以让这个行为不可预料了。
一方面我觉得,包括linus对C++的批评,只是一个关注的抽象层次不同的问题。
你只接受语言工作在某一个抽象水平,不接受一门可以跨越多个抽象层次的语言……
你需要一门语言,比如C,来限制你不会轻易、无意识地做出过于低效或危险的事情。
另一方面,如同以前讨论exp only的问题。
是否有副作用,与是否是表达式,本来就是两个正交的概念。
只是lua设计得让有副作用的都是语句,没副作用的都是表达式,但不是所有区分表达式/语句的语言都如此。
lisp只有有副作用的表达式与没副作用的表达式之分。
+是否能映射到机器代码,与+的抽象含义本来也是两个正交的概念。只是C语言让+能映射到(long long也算吧……),对不能映射的自己写函数。
C++/lisp有只有能映射到的+,如int,与不能映射到的+,如string/bignum。
可以让语言提供一些机制,让用户可以提出一些限制,比如某些部分:
1. 不需要dynamic typing
2. 不需要gc
3. 不需要eval
4. 必须映射到机器码的+
5. 必须复用栈空间
……
我自己都想这么干。人肉分析某些代码会不会怎样太累了,应该让程序协助自动完成。
但完全禁止1,2,3,禁止加法重载,禁止递归什么我觉得就不可接受了。
如果我要设计,一定是允许跨越多个抽象层次的语言,上至lisp下至C(如果有可移植的汇编格式甚至还可以继续往下……)。
跨语言是件很搓的事情…… 手工编写绑定太累…… 自动产生?那我才是真的心里没底……
最后,还是关于+的事情:
http://www.gigamonkeys.com/book/conclusion-whats-next.html
(defun add (x y)
(declare (optimize (speed 3) (safety 0)))
(declare (fixnum x y))
(the fixnum (+ x y)))
CL-USER> (disassemble 'add)
;; disassembly of #<Function ADD>
;; formals: X Y
;; code start: #x7374dc34:
0: 03 c2 addl eax,edx
2: f8 clc
3: 8b 75 fc movl esi,[ebp-4]
6: c3 ret
7: 90 nop
; No value
我猜fixnum,the只是告知编译器使用int。 也许是safety 0告知编译器加法被替换了也不管……
|
|