随笔分类 - 动态语言
摘要:这个解释器可以用来跑前面两篇文章的例子,所以一并扔出来,三部曲哈哈。Lisp内置的S-expression相当于解析好的语法树,而借助quasiquote和unquote又很容易进行语法树层面的变换,所以Lisp的自举和扩展都很容易。相对而言,其他语言有入门教材就讲怎么实现语言自身的解释器的吗?至少...
        阅读全文
                
摘要:这题目确实比较杀脑细胞...原题:1 (let* ((yin2 ((lambda (cc) (display "@") cc) (call-with-current-continuation (lambda (c) c))))3 (yang4 ((l...
        阅读全文
                
摘要:嗯,来写写经过:在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 =>我也想写一个,用lua写,能多简单呢? =>写了一个阉割的scheme解释器,包含lambda/if两个special form,以及+-=print几个过程,60行代码 =>能再...
        阅读全文
                
摘要:首先声明,我用的是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来处理这...
        阅读全文
                
摘要:在这两种语言中,表达式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中测试一下
        阅读全文
                
摘要:lua版本5.1函数"function (...)"的函数体中, 如果使用了"..."表达式, 语言后台就不会帮你打包"arg"对象了; 所以不能混用这两者.即, 以下两种方式只能2选1:function printArgLength(...)print(select("#", ...))-- print(#arg)end
        阅读全文
                
 
                    
                     
                    
                 
                    
                
 
         浙公网安备 33010602011771号
浙公网安备 33010602011771号