人是社会关系的总和,程序员的技术某种意义是他打交道各种程序语言的总和。
每一个新朋友都能给人带来新的世界,Scheme果然不一般。
前几天群主引用王垠的文章https://0xffff.one/d/341/7 让我猛然想起半年多前看到他的博客,那时候只是看到了他谈数学和计算机的区别以为他是个像我们一样初学者但对有些问题有比较强烈的看法,正所谓年轻气盛。
然后就发现原来他都40多了。。。
此处省略很多中间过程,通过他的博客我重新想起Scheme,早就知道那本著名的书用Scheme做入门,不妨试试。
结果发现Scheme并不是之前想象的那么晦涩复杂,反而十分简洁。可能之前被它的括号系统误导了,其实括号在Scheme里恰到好处。
我想大家应该都对Scheme有基本的了解,所以仅仅说下我的感受:
1 简洁美。入门不是叫你什么main方法、static和boolean之类的关键词,而是通过(method argument...)「省略号表示varargs」先展示出基本语法——在此基础上层层扩展。
2 IDE和社区的缺乏。毕竟不是做工程开发的主流语言,但语法本身特征让我在入门阶段不需要非常复杂的代码检查、重构之类的功能,根据王垠等人的文章可以理解出这也不是Scheme非常需要的。
用Linux的terminal可以运行mit-scheme(同名软件),目前找到唯一合适的类似Notepad++的IDE是Dr Racket。
这张图显示了基本界面。其中变暗的部分「(define (factorial n)下面」显示鼠标停留后对括号内容的高亮。
Dr Racket貌似没有自动补全功能,比如输左括号补右括号,输入一部分关键字提示可能的全部关键字,但括号高亮还是有的。
3 突出计算本质。我之前接触的计算机和计算教程全部是从工具出发,无论是从汇编讲到高级语言,还是根据某些平台(Python的numpy、Java的Deeplearning4j等)讲库的使用都没有从基本的计算需要出发,而这是王垠博客里一些文章提到的问题「也因此我意识到Scheme非常独特」。
刚才图片上的代码的原书(Concept of Programming Languages ,Robert Sebesta ,11e )中作者原话:“编程语言是计算机结构的抽象”。但实际上,不是人们根据冯诺依曼结构才设计出编程语言的。之前我对语言学包括形式语言有所涉猎,我认为王垠的看法符合历史事实,在早期编程语言Fortran之类的出现之前已经有基于自然语言的形式化探索,语境无关语法/乔姆斯基的那些东西早在19世纪后半页就有雏形,数学计算是作为广义的逻辑表达的一个种类看待的。
Scheme突出了人们从计算需要本身出发进行编程这一主题。有些程序语言的设计突出硬件特征,这是狭隘的。人是工具的主人。
4 Scheme的基本语法对static、dynamic语言分类是一个挑战。王垠用late binding指称“动态语言”,我初步的印象是,Scheme有可称为“duck typed”的成分,某种类似Python和Ruby,姑且称之为“规约类型”的检查,但应该不止于此。类型系统是编程语言中非常重要的一个概念,我会在未来加以关注。
5 Scheme的一些语法能在我学过的一些语言中找到继承,比如lambda表达(Java,可惜还没用过); R语言中很多内容比如函数名在前的设计,只不过括号里只装参数了,apply关键字, dplyr包的柯里化 %>% 和函数作为一类变量的都可能直接来自Scheme等函数式编程语言。
大家怎么看Scheme,有什么学习经验?