随笔分类 -  动态语言

摘要:这个解释器可以用来跑前面两篇文章的例子,所以一并扔出来,三部曲哈哈。Lisp内置的S-expression相当于解析好的语法树,而借助quasiquote和unquote又很容易进行语法树层面的变换,所以Lisp的自举和扩展都很容易。相对而言,其他语言有入门教材就讲怎么实现语言自身的解释器的吗?至少... 阅读全文
posted @ 2014-05-31 09:47 Scan. 阅读(1266) 评论(0) 推荐(0)
摘要:这题目确实比较杀脑细胞...原题:1 (let* ((yin2 ((lambda (cc) (display "@") cc) (call-with-current-continuation (lambda (c) c))))3 (yang4 ((l... 阅读全文
posted @ 2014-05-23 03:10 Scan. 阅读(1414) 评论(0) 推荐(0)
摘要:嗯,来写写经过:在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 =>我也想写一个,用lua写,能多简单呢? =>写了一个阉割的scheme解释器,包含lambda/if两个special form,以及+-=print几个过程,60行代码 =>能再... 阅读全文
posted @ 2014-05-21 03:27 Scan. 阅读(4472) 评论(0) 推荐(0)
摘要:首先声明,我用的是2.7.1版本的CPython。第一个问题,闭包中的upvalue不可修改: 1 def foo(): 2 i = 0 3 def _foo(): 4 i += 1 5 print i 6 return _foo 7 8 f = foo() 9 f()10 f()11 f()错误:local variable 'i' referenced before assignment可以理解,不用global关键字的话,修改全局变量也会遇到问题。因此这个问题其实是不能修改所有外层变量。python3引入了nonlocal来处理这... 阅读全文
posted @ 2012-01-12 19:35 Scan. 阅读(1396) 评论(0) 推荐(1)
摘要:在这两种语言中,表达式a and b的返回值不是true或false,而是a/b当中非真的值,而表示a or b返回的是a/b当中为真的那个。因此,要想模拟C/C++中的三元操作符c ? a : b,简单的用c and a or b是不行的,因为当c为真,而a为假时,返回的是b而不是a,这不符合三元操作符的定义。以前学lua的时候,看lua之父的那本《lua程序设计》,他提到这个问题,但没有说怎么解决,而是推荐用普通的if/else代替,今天我在看《python核心编程》的时候,发现原来python社区早处理好了这个问题(当然,肯定lua社区早也处理好,我不知道罢了),这里也在lua中测试一下 阅读全文
posted @ 2012-01-09 23:20 Scan. 阅读(5437) 评论(0) 推荐(0)
摘要:lua版本5.1函数"function (...)"的函数体中, 如果使用了"..."表达式, 语言后台就不会帮你打包"arg"对象了; 所以不能混用这两者.即, 以下两种方式只能2选1:function printArgLength(...)print(select("#", ...))-- print(#arg)end 阅读全文
posted @ 2011-04-20 13:00 Scan. 阅读(11047) 评论(0) 推荐(0)