关于Emacs与Elisp

ChongQingJin28 2012-12-14 09:07:14
看C++论坛的时候,看到关于emacs与微软VS ide之间的讨论

由于没有用过VS,只用过eclipse,觉得已经很不错了(我能写一些小的plugins)

但是别人却说Emacs是神的编辑器,真的不知道为什么会这么说

于是下载了一个emacs for windows用了用


我用的方式是通过学习emacs的lisp语言来学习emacs的

(一本入门的书 programming in emacs lisp An Introduction)

这本书中最吸引我的一句话是:在源码之间跳跃!

我看过的关于lisp的文章:《lisp的本质》



通过几天的学习发现真的挺好的。

现在只能举两个例子:

1. emacs可以找到一个快捷键的源码,并且可以轻而易举的修改它!

(快捷键相当于eclipse里面的actionset或command)

VS能不能这样我不知道,eclipse如果有插件的源码,也可以修改,但是却没有emacs这样方便

(至少eclipse插件修改的效率要比emacs慢)


2.editor的数量:

eclipse的editor只能有一个,虽说可以有多个viewer,但是和emacs的多个editor相比,emacs或许会更好



elisp和python有相似的地方,或许更准确的说是python和elisp有相似的地方

都是动态语言,都可以处理list(到现在我只知道这么多)


我觉得既然python语言和lisp有相似的地方,python据说一个星期就能学会

那么lisp应该也不会太难。python有pydoc,lisp也有。(一本reference应该足够!)

那么为什么不用两个月的时间学一下elisp呢,或者是学一下emacs。

你应该会有收获的!!

...全文
544 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
personball 2013-02-20
  • 打赏
  • 举报
回复
引用 楼主 zhouchongzxc 的回复:
我觉得既然python语言和lisp有相似的地方,python据说一个星期就能学会 那么lisp应该也不会太难
lisp的学习难度不低的。。 真心要学的话,建议从lambda演算开始。。。(lisp和c的差别就是前者基于lambda演算,后者基于图灵机,lambda演算是图灵等价的) 这货感觉是入门要三四个月,熟练乃至精通,没个几年是完全不可能的,而且方言众多, 比较通用的是common lisp
ChongQingJin28 2012-12-19
  • 打赏
  • 举报
回复
我继续楼上关于编译与解释的讨论吧

编译好像有两种情况
1.直接针对某个cpu的,比如说gcc可以生成多种cpu的指令码,而javac仅仅能生成针对jvm的字节码

2.针对某一个解释器的,比如说emacs有elc文件,python也有pyc文件。

我的理解是解释器是更高级的cpu的指令集。(或者说更高的层)

好像解释的概念已经不是basic时代的了,他同样是有编译的,只是编译的目标不同而已。
panghuhu250 2012-12-19
  • 打赏
  • 举报
回复
引用 10 楼 openXMPP 的回复:
lisp好像是跑虚拟机上的吧? 不确定 但我看emacs源码 里很大一部分是基于lisp的 其余一部分是c++ c shell什么的 而且又有windows版本的emacs 所以我觉得lisp是有可能生成native的code的 但我不太清楚lisp这样的函数语言是否对应的编译 还是 解释
编译还是解释不是语言的特性,而是具体实现的特性。同样是lisp,emacs lisp是用解释器实现的,emacs本身就是一个解释器,也有sbcl(common lisp的实现)是把代码编译成机器代码再执行的。
I_NBFA 2012-12-18
  • 打赏
  • 举报
回复
powerpc是RISC,打错了。
I_NBFA 2012-12-18
  • 打赏
  • 举报
回复
一般动态语言都需要虚拟机,因为在硬件层并不提供动态语言的全部特性,像动态类型,垃圾啥的都需要一个托管环 境,而且动态语言也以优良的可移植性著称,这一切都需要虚拟机。
I_NBFA 2012-12-18
  • 打赏
  • 举报
回复
x86鼻祖8086就已经分段了,pe是系统组织可执行文件的方式,虽然会考量硬件架构,但数据+代码是软硬件的共 识,发展的必然趋势,而且就本质来讲代码也是数据的一种,所谓代码段/数据段只是逻辑上的概念,早期计算机并 不严格区分两者,完全可以代码当数据,数据当代码,切换一下CS:IP而已,只是后来加强了这方面的控制并做了一些列功能上的改进,但仍然是换汤不换药, 所以你明白动态语言为啥要这么干了么?动态语言的特色之一就是在运行时动态改变自身结构,它不像静态语言自身结构是死的定型的,其实与其说是特色,不如说是再次模糊了数据和代码的边界,当然这种模糊是可选的,这样做有啥好处呢好处很多,非常有必要动态生成代码,你搜一搜"java反射"就知道了,而MFC频繁使用的动态创建更是以纯静态语言模拟了一遍动态语言唾手可得的功能,至于应用量的问题,那就是多方面的原因了一言难尽,不过有一点可以肯定,像神马垃圾收集,递归,动态类型,元语言,还有现在新兴的FP等等都是lisp率先引入的。 CPU的功能虽然差不多,但架构和具体实现的差异会很大,比如x86属于CISC,powerpc是CISC,指令格式微 解码处理很不同,寄存器数量也差很多,虚拟机可以理解成软CPU,在硬CPU上以软件模拟统一的软指令集,对于 用户是完全透明的,具体差异留给虚拟机作者。
ChongQingJin28 2012-12-18
  • 打赏
  • 举报
回复

以上的这些都是在读到《programming in emacs lisp An Introduction》第8章的过程中的想法。
因为我觉得第8章的内容太少了,决定去看那本《ELisp.Reference.Manual》。
reference好像是和python自带的doc一样。

if(没有新的回帖):
____明日结贴
else:
____等到没有新回帖的那一天!



ChongQingJin28 2012-12-18
  • 打赏
  • 举报
回复
回复10楼 lisp好像是跑虚拟机上的吧
还真的有虚拟机上面的lisp
但是python不是也有jython吗?
虚拟机应该是用另一种指令集的cpu,但cpu的功能都是差不多的
既然能在intel上面运行,自然也能在其他cpu上面运行
ChongQingJin28 2012-12-18
  • 打赏
  • 举报
回复
谢谢11楼、12楼!!

非常惭愧,我还不知道paredit与slime呢。谢谢提醒。

lisp的macro我会继续了解。

common lisp听到过。但是并不想深入。只是想知道emacs与elisp,希望能用他们改善编辑环境

觉得还是python更好一点。语法很好。库也很多(比如说numpy,boostpy)。
觉得lisp更适合于机器去理解,而人则更容易理解python!

panghuhu250 2012-12-18
  • 打赏
  • 举报
回复
引用 5 楼 zhouchongzxc 的回复:
有一点不好的就是elisp的“()”太多了,不容易看出哪个与哪个对应,与python比起来有点难读。恐怕要做很多的注释才行。
由于一切都是基于keyword,我又不知道如何扩展keyword,功能会有点限制。用python扩展或许可以解决这个问题??

写lisp code要用支持括号匹配的编辑器,例如emacs。看lisp代码的结构不能靠数括号,而是靠缩进(就像你的另一个帖子里说的)。

如果一定要看括号的话,rainbow mode很好玩(但我不会用它,太晃眼了)。另外还有mode把括号颜色变淡。

另外,paredit对编辑lisp code很有帮助。slime更是common lisp编程的好工具。
panghuhu250 2012-12-18
  • 打赏
  • 举报
回复
引用 9 楼 zhouchongzxc 的回复:
但是这种在数据与函数之间的转换有什么意义吗? 我们已经习惯了用库的方式去组织函数,用源文件的方式来调用库函数 还用得着去动态的生成一个东西再去调用函数吗? 他和我们直接在源文件中的代码有什么区别吗? 以文件为单位去调用库函数不是更加具有可扩展性吗? 难道只是为了一个能够在函数与数据之间相互转换的语言特性吗? 这是为什么C比lisp更被广泛使用的原因吗?
兄弟很深刻啊!随便想想就想到这儿了。lisp与其他语言最大的不同就在这儿:代码数据同型使得lisp支持宏(macro)。lisp的很多特性(动态语言,函数式编程等)已经被其他语言吸收,实现了,唯有macro还是lisp独有的。
乔巴好萌 2012-12-17
  • 打赏
  • 举报
回复
lisp好像是跑虚拟机上的吧? 不确定 但我看emacs源码 里很大一部分是基于lisp的 其余一部分是c++ c shell什么的 而且又有windows版本的emacs 所以我觉得lisp是有可能生成native的code的 但我不太清楚lisp这样的函数语言是否对应的编译 还是 解释
ChongQingJin28 2012-12-16
  • 打赏
  • 举报
回复
说一下语言吧(仅仅是我知道)。
asm应该算是一种,可以和机器语言、java的bytecode放在一起。
不一定用他写程序,但是至少应该知道常用的指令集有什么(用一天足够了吧)

C和lisp可以放在一起,虽说一个是动态一个是静态,但至少都是面向过程的。
C的数据是struct,lisp的是list。其实仔细想想,树结构也是一种list,允许嵌套的list
嵌套是一种递归,为什么只允许函数递归,就不允许数据递归呢?
C将数据与函数分开处理,而lisp却认为他们应该用同样的方式处理。
(这个用多少天呢?仅仅学会语法的话,半个月够吗?)

后来,C演化成了C++,C++之后又有了Java、C#、Object C(我不知道他是否应该放在C++之后,但是可以和C++归为一类)
lisp呢?相似的有perl、ruby、python(只是因为都是动态的语言,perl和python很像,不知道ruby会怎样)
面向对象好像是把数据与函数的处理给模块化了,这就是所谓的封装?
脚本语言有天生的动态性,C语言也可以借助指针实现动态的功能,这就是所谓的多态吗?
动态的决定应该执行那个模块内的代码,这就是所谓的继承吗?
(我用了一个月的时间都没有明白perl的对象是怎么回事,用了一天就知道python的对象是怎么回事了,怎么会差这么多。)



再说一下我的一个想法:
前面说过我不喜欢info一长串的node,代码也同样是一长串
于是我有了一个想法:把代码分层

比如说C语言的main在第一层,被main直接调用的函数在第二层,间接调用的在第三层
不用改变C文件,只是在编辑的时候重新整理一下就够了。
用eclipse能实现(创建editor,读取部分代码就够了!可以用一个multpage,也可以用多个editor)
emacs应该也是可以实现的,由于emacs的多个buffer,应该比eclipse的要好。
ChongQingJin28 2012-12-16
  • 打赏
  • 举报
回复
继续说C与lisp

windows上面的exe文件,是一种pe结构。pe结构是分段的。
有data段,code段,其他的段我就不知道了。
(你可以用notepad打开一个exe文件,在开始的地方就能看到这些段的定义)
之所以采取这样的方式,是因为从286的时候起,intel的cpu就已经支持这种分段的机制了
所以C把函数与数据分开的这种方式是无可厚非的。

不知道为什么lisp没有采用这种方式
(他可能觉得不应该把函数与数据分开)
lisp中的数据与函数的转换是非常简单的
你可以在一个list前面加一个“‘”,他就是一个数据了
同样,你也可以用eval(list)的方法,把数据变成一个函数去执行
能够这样做要归功于两个东西:
1.动态的eval(python、perl中都有的)
2.lisp中最简单也是最基本的数据机构:list

但是这种在数据与函数之间的转换有什么意义吗?
我们已经习惯了用库的方式去组织函数,用源文件的方式来调用库函数
还用得着去动态的生成一个东西再去调用函数吗?
他和我们直接在源文件中的代码有什么区别吗?
以文件为单位去调用库函数不是更加具有可扩展性吗?
难道只是为了一个能够在函数与数据之间相互转换的语言特性吗?
这是为什么C比lisp更被广泛使用的原因吗?

我想不明白这个问题!!


乔巴好萌 2012-12-15
  • 打赏
  • 举报
回复
我也尝试用了用emacs 不过没有系统的学elisp emacs感觉配置还是很精细 如果纯基于emacs打造一个IDE还是很耗费精力的 我觉得emacs更适合如python php html这样的语言 对于需要编译或者和体系结构相关的开发 emacs的配置往往比较吃力
ChongQingJin28 2012-12-15
  • 打赏
  • 举报
回复
关于elisp中的“()”太多的问题,我想到了一个解决的办法 :用python的语法写elisp。
因为python没有elips的“()”,没有Java的“{}”,没有ruby的“end”,完全可以用缩进来代替“()”
需要用antlr得到语法树,进而生成elipse的代码,由于antlr还不会用,所以需要一定的时间。
emacs可以用来写antlr,挺方便的!

很不喜欢info文档中的一长串的node,会觉得他们之间完全没有关系,或仅仅是顺序的关系
(chm是这样的,html是这样的,pdf居然还是这样的)(或许是因为东西方思维方式不同)
我想我可以用另外的一种格式,一种分块的格式,把有关联的东西组合在一起。这样的效率应该会更高的吧!
(这样在用emacs的时候就不能仅仅占半个屏幕了)
这个比上一个要容易的多了。

因为要分块,必须用另一种选择文本的方法,不是从开始到结束的连续文本,而是每一行都有一个开始与结束
这个就更容易实现了。
(或许可以用于改善idle->>>help()->keywords。但是可惜idle不支持push-button。)
ChongQingJin28 2012-12-14
  • 打赏
  • 举报
回复
百度了一下emacs中调用python
还真的找到了:pymacs。python能用在emacs里面,可以用python扩展emacs了。挺好!!

学习了几天的elisp,发现和python其实很像,完全可以用学习python的方式学习elisp。
比如说keyword可以用过搜索emacs.exe或是直接看DOCX文件都可以了解
顺序、分支、循环都是一样的,只是写法不同。
keyword都是C语言写的,其他的el文件都是基于keyword的。
可以把el当成python里面的库。这样python语言和elisp语言好像就没有什么区别了。

有一点不好的就是elisp的“()”太多了,不容易看出哪个与哪个对应,与python比起来有点难读。恐怕要做很多的注释才行。
由于一切都是基于keyword,我又不知道如何扩展keyword,功能会有点限制。用python扩展或许可以解决这个问题??
ChongQingJin28 2012-12-14
  • 打赏
  • 举报
回复
回复2楼 关于edtorg好像在。 eclipse里我不能打开同一个文件两次,当然,这个没有什么好处,可能只有坏处
但是好像也不能同时看两个java文件的代码,这个可能就有那么一点用处了。
zjs100901 2012-12-14
  • 打赏
  • 举报
回复
霜之哀伤 2012-12-14
  • 打赏
  • 举报
回复
eclipse的editor只能有一个?
加载更多回复(1)

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧