在我编写的许多脚本中,我经常以“功能样式”构建程序。也就是说,我基本上在开始时定义了很多函数,然后再应用这些函数。这导致一系列嵌套函数调用,其中我输入:
......等等。
对于函数“管道”在一起的情况,一个函数的输出是下一个函数的参数(通常是第一个,但不总是),其输出是下一个函数的参数,以及广告无穷。在前缀表示法中,如果您从左到右键入此序列,则键移动可能非常突然。例如,你如何键入以下[Python]示例的第二行(~mul~是乘法,~truediv~是除法)?
from operator import add, mul, truediv
print(truediv(mul(add(1,1),2),4))
如果我必须线性地编写相同的操作集(从左到写,不跳转),我更可能使用函数组合的表示法。基于我之前在Python中的示例,我可能会写
from functional import foldr, compose, partial, flip
print(foldr(compose,add,(partial(mul,2),partial(flip(truediv),4)))(1,1))
我认为这是因为我将每个函数与其自己的参数相关联,并且更喜欢连续输入它们,而不是在第一个函数的参数列表完成之前将参数填充到另一个函数(因为需要输出第一个例子从左到右)。
我注意到了这一点,因为我很长一段时间以来一直是emacs用户,并且最近才尝试过viper / vimpuse和vim。在emacs中,我可能会做类似
的事情......等等,偶尔使用M-b,M-f,M-DEL(后向单词,前向单词,后向单词),如果我搞砸或忘记了什么。
我最近在vim中发现了C-o,这是一个救星 - 但我发现等效键将是
......其余的;后向词,前向词和后向词 - 等同词将是C-o b和C-o w,以及C-w。
所以这让我想到要在vim中编程,我可能需要增加一个更大的工作内存,这样我可以暂停一个函数的构造,因为我填写另一个函数,依此类推。此外,在构建文本文档时,我发现即使在完成一个完整的思考之前我也经常编辑(杀死,复制,猛拉),这对于vim的“保持正常模式,插入文本的突发”的操作风格来说是不太合适的。 -mode,并回到正常模式“,这似乎假设我能够在我进入插入模式的过程中产生值得编辑的东西。为了使用vim,我发现在输入时我会考虑更多,以减少模式之间切换的频率。这是因为我自然是痉挛性的,或者一旦我掌握或提出适当范围的肌肉记忆的vim关键命令,我会不会认为它们是如此不同?
如果您同时使用emacs和vim编程,您是否发现自己在每个编辑器中以不同的方式思考和构建程序和文本块?
答案 0 :(得分:4)
我从1992年的美好时光开始使用vi,现在我从2001年开始使用Emacs。在编写函数和代码块时,我没有注意到我的想法有什么不同。两位编辑都有自己的特点和做事方式,但他们不是那么强大,以至于他们可以改变你的思维方式和你的编程方式。
我一直试图找到办法去做我打算做的事情。我不让我的编辑强迫我做一些我不想要的事情。当我对一段新代码进行程序编程时,我使用了名为“一厢情愿”的技术mentioned in Structure and Interpretation of Computer Programs:
您可以想象自己处于一个完美的世界,拥有您需要的所有程序。您可以使用您需要实现的所有有用功能对算法进行编码,但目前只有原型。它类似于自上而下的方法。