编程语言中的变量作用域与闭包

如果你写过 javascript,应该听说过变量提升(hoisting),如果你自诩“Life is short, I use Python”,那么多多少少会用过globalnonlocal这两个关键字。无论新手还是老手,遇到这些时都会觉得很别扭,稍不留神就会出现意想不到的 bug,如果你仔细观察就会发现,它们其实是一个问题:变量作用域的问题。

阅读更多

SICP 第五章总结

经过第四章元语言抽象的洗礼,我们已经能够深谙编译器内部的原理,核心就是eval-apply循环,只是说基于这个核心可以有各种延伸,像延迟求值、amb 不定选择求值、逻辑求值等等,有了这层的理解,我们应该能够透过各种花哨的语法糖,看出其本质来,像 Node.js 中的 Promise、 Python 中的 coroutine,都是 continuation 的一种应用而已。

阅读更多

SICP 第四章总结

本书的前三章分别讨论了数据抽象过程抽象模块化三种程序设计的技术,这些都是编程的问题,一直采用的是 Scheme 作为编程语言。如果遇到的问题更复杂,或者需要解决某领域的大量问题,有可能发现现实可用的语言(Lisp,或其他)都不够满意或不够方便,因此第四章主要就是讲述如何设计和实现一门新语言。

阅读更多

python, ruby, javascript 浅析

最近一直在看红宝石(ruby)语言,到现在为止,算是对其设计有一些了解。作为一动态语言,ruby 经常会拿来与 python 对比,确实这两门语言在语法层面、实现层面有很多共同的地方,但是它们也在很多设计理念上存在重要差异,通过对比这些相同点、异同点,更加有助于理解这两门语言。同时,Node.js、React Native 的出现,将 javascript 这门“前端”语言推向了全栈,同样作为一门动态语言,javascript 与 ruby、python 在很多概念上也存在很多相同点、异同点。

阅读更多

如何实现一个没有名字的递归函数

递归 作为计算机科学中很重要的一个概念,应用范围非常广泛。比较重要的数据结构,像树、图,本身就是递归定义的。
比较常见的递归算法有阶乘斐波那契数等,它们都是在定义函数的同时又引用本身,对于初学者来说也比较好理解,但是如果你对编程语言,特别是函数式语言,有所研究,可能就会有下面的疑问:

阅读更多

2015 年终总结

今天,已经是 2016 年的第八天了。时间总是这样,当我们身处其中时觉得很漫长,但是过后看看,也没觉得什么。
2015 年是毕业后正式工作的第一年,地点从上海转到了杭州,2014 年终总结时做的那些计划,貌似也没能全部实现。
这篇文章主要回忆 2015 年中那些印象深刻的事与人,同时展望美好的 2016。

阅读更多

SICP 第三章总结

历时三个月,终于把第三章看完了。这三月发生了太多的意外,本文不打算说了,后面在写 2015 年终总结时再来谈谈这三个月的事情。如今回过头来看看第三章的内容,好像也不怎么难,只是内容涉及的面稍微广一些而已,下面来回顾总结一下第三章。

阅读更多

字符串,那些你不知道的事

最近在看《Dive Into Python 3》,第四章讲了字符串相关知识,看后才发现,字符串远比我们想象的要复杂多。就像该书所说的

阅读更多

SF 黑客马拉松赛后回顾

上个周末,也就是10月24、25号,参加了人生中第一次黑客马拉松(hackathon),虽然最终没有获奖,但是这个比赛过程中还是 hack 的挺爽,趁现在还有余热,纪录下比赛时的一些心得与收获。

阅读更多

转载『非科班出身的人学习编程不负责任指南』

来我们这个实验室里读研的学生可能自从来到这里的第一天就觉得自己的命运很苦逼。他们读本科时主修的是机械设计、制造以及自动化之类的专业,毕业时的简历上也顶多是写写擅长 MS Word、PowerPoint、UGNX、AutoCAD 之类的应用软件。他们有限的学习生涯里,怎么也不会想到来到这里竟然要首先重新学习 C 语言,然后还要学 C++,接下来还要学习 Python 或 Lua 什么的,而且竟然还不让用 Windows,只能用连个 QQ 都没有并且经常出故障的 Linux……

阅读更多