【实验】用 elisp 教编程

最近在教我弟编程,大体思路是:以 elisp 入手点学习编程语言中普遍存在的概念;然后再把这些概念对应到 1. JavaScript 上学网页编程,2. Python 上学爬虫编程;同时在这个过程中引入一些常用的工具比如 git。

之所以选择 elisp:

  1. 源码随写随跑,反馈循环非常顺畅
  2. 自带文档,非常方便查看
  3. 搭建环境非常容易,只用下载一个 Emacs 就行
  4. 自带大量的真实源码可供阅读,随时修改随时看到结果
  5. Lisp 的语法非常简单,且非常严谨

缺点是:

  1. 括号编辑起来比较麻烦 – 通过引入 awesome-pair / company-mode / ivy / rainbow-delimiters 等插件来降低编辑难度, awesome-pair 是类似于 paredit 的一个插件
  2. 一些练习(elisp intro 上面的习题)需要学一些 emacs 的相关知识,比如 buffer 相关的函数等等,这些出了 emacs 就没什么用了,而我只是想教编程 – 尽量避开这类练习,用到的时候再讲

目前进展良好,先在论坛立个帖子,后续会追加一些新的体悟。

大家有什么建议?


更新:

为什么选择 elisp?

以『尽量减少学习者 burn out 的可能性』为目标,我的教学策略是:1. 尽量边学边用提高趣味性,2. 尽量降低入门的难度。

(当然,趣味性很主观,但我自己入门的时候,特别不喜欢做数学性强的习题, 比如 SICP 的很多题,让我“爽”到的,是那种写完了立马就能用的:比如我进行文本编辑时,发现经常想要跳到下一个空行,于是就基于 search-forward-regexp 写一个小命令来实现 —— 写出来之后我会感觉特别开心)

基于1,所选语言得有一个实际的“交互环境” —— javascript 写了立刻就能在浏览器中看到效果,elisp 写了立刻就能在 emacs 中看到效果

基于2,所选语言的语法要尽量简洁 —— 筛掉了语法比较“脏”的 javascript

这是为什么排除了 c/rust/java 这类编译型语言,也排除了 python/ruby 之类的解释型语言,并且也排除了 scheme/clojure 之类的其他 lisp 的原因。

目前的反思

之前的教学,都是跟着 emacs 自带的 elisp intro 走,但发现里面讲了太多 emacs 独有的概念,不符合教学策略2,所以这两天跳出了 elisp intro,自己重新制定了教学计划。

重新总结后的教学计划草稿

hacking-intro/README.org at master · RenWenshan/hacking-intro · GitHub


更新 2020/04/16

之前我都是开 zoom 基本上即兴讲(因为之前主要是跟着 elisp intro 走,不需要太多准备),后来发现这样:1. 有时候因为我自己没想明白而耗费时间 2. 常常一节课两三个小时,不利于课后复习。

所以想到,可以就各 topic 分别录小段的视频,这样1. 讲得太差的话可以重录,2. 时长较短方便复习。

试了一下:【肉山编程入门课 2020年4月】1.4.1 把函数做为参数传递, apply, funcall_哔哩哔哩_bilibili

  • 大家有什么建议请尽管讲
  • 我平时很少写 lisp,所没太优化过编辑操作,大家看到哪里有提升空间的还望指点下啊
9 个赞

应该没有哪个语言比 lisp 里面更容易处理括号。你需要 paredit。顺带一提,教 elisp 不是个好点子。

parinfer 被您“放弃”了嘛qwq

我觉得,要不去尝试数学编程,去试试欧拉计划?

还在想这事,parinfer首先不是100%的解决方案,他不能解决raise, transpose 的问题。 其次就是性能问题。

我用的时候也遇到了一些问题…不过用缩进控制括号的想法还是很酷的(qwq

你这是劝退。做 project Euler 至少也是看 TAOCP 水准了,这样程度早可以开始指点別人

1 个赞

:joy:是吗,我觉得先入手简单的数学问题会好学一点,这样不用接触一些语言的奇葩feature

我还没有真正了解lisp,但是如果有一天我能深刻理解lisp的各种细节,应该也会选用这种语言教。但是目前不会。

其实是可行的,但是不要教太多工具,参考 A little Schemer 和 SICP

Emacs Lisp 的一个特别之处是「形象」,特别是指令式模式写代码时,眼看到的、手操作的直接转化成代码,比如给每一行结尾加个句号,把手操作一比一写成代码就 OK 了。

1 个赞

嗯,我觉得会用 paredit 之后 lisp 反倒是最容易编辑的语言。上面提到的 awesome-pair 是一个类似于 paredit 的插件。

至于编程语言,我也有过衡量,最终是因为那5点优势做出了选择。

我没接触过 parinfer

有考虑过,但我自己入门的时候,特别不喜欢数学性强的习题(例如 sicp 上的很多题), 让我“爽”到的,是那种写完了就能用的:比如我进行文本编辑时,发现经常想要跳到下一个空行,于是就基于 search-forward-regexp 写一个小命令来实现 —— 这种写出来之后我会特高兴。

基于此,我这次的教学实验会尽量避免数学题。

嗯,我之前考量过挺长时间,筛掉了不少方案,最终剩下了两个:一是 HTML/CSS/JavaScript 入门,二是 elisp 入门。最终选了 elisp,是因为我觉得 JavaScript 的语法比较“乱”,而我的策略是尽量降低入门难度,从而尽量减轻学习者 burn out 的可能性。所以想先通过 elisp 把变量、循环、函数……这些概念学会,再教 HTML/CSS/JavaScript

多谢。我之前基本是跟着 emacs 自带的 elisp intro 走,后来发现太多 emacs 独有的东西了。我的策略是尽量降低入门难度,从而尽量减轻学习者 burn out 的可能性,学太多 emacs 的东西会分神,所以这两天从 elisp intro 跳出来了,自己重新设计了教学计划和习题。

SICP 和 A Little Schemer 我觉得对初学者而言有些难,而且很多东西也应用不到其他编程语言上,我只挑了一些内容出来讲。

不好意思,没看懂。什么是指令模式?还有什么是『给每一行结尾加个句号,把手操作一比一写成代码就 OK 了』?是说 kmacro 转成 command 吗?

1 个赞

我觉得教编程思想要少涉及emacs的api,把elisp当作存粹的编程语言,教一些基本的语法和算法思路。

1 个赞

写得很透彻啊!

有点儿看 量子物理史话 的感觉