我正在看Scheme,看起来比common lisp好懂

418 views
Skip to first unread message

David Day

unread,
Aug 23, 2012, 2:40:34 AM8/23/12
to cn-cl...@googlegroups.com
感觉比c-lisp清晰

dennis zhuang

unread,
Aug 23, 2012, 2:58:12 AM8/23/12
to cn-cl...@googlegroups.com
那我推荐你看clojure,更实用一些。

在 2012年8月23日 下午2:40,David Day <dave...@gmail.com>写道:
感觉比c-lisp清晰



--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008



David Day

unread,
Aug 23, 2012, 2:59:53 AM8/23/12
to cn-cl...@googlegroups.com
我现在需要的不是实用,而是深入理解lisp

Ruiyun Wen

unread,
Aug 23, 2012, 5:03:13 AM8/23/12
to cn-cl...@googlegroups.com
我也在看sicp,只是各种事情很多,阅读进度就很慢。
真的推荐大伙儿没事的时候看看。

David Day

unread,
Aug 23, 2012, 5:04:35 AM8/23/12
to cn-cl...@googlegroups.com
这本书我刚入手,正在看。

Shen, Feng

unread,
Aug 23, 2012, 5:16:36 AM8/23/12
to cn-cl...@googlegroups.com
我也在读。 刚开始。  
还打算用go实现一个lisp interpreter, 看看感觉。

沈锋
美味书签 http://mei.fm 



2012/8/23 David Day <dave...@gmail.com>

David Day

unread,
Aug 23, 2012, 5:17:52 AM8/23/12
to cn-cl...@googlegroups.com
go也是lisp方言?

Shen, Feng

unread,
Aug 23, 2012, 5:21:19 AM8/23/12
to cn-cl...@googlegroups.com

我看了一些go, 感觉很不错。  想用它写点代码, 实验实验。 碰巧也想看 scip, 就想着一边看, 一边用它写个interpreter。练练手而已。

dennis zhuang

unread,
Aug 23, 2012, 5:26:50 AM8/23/12
to cn-cl...@googlegroups.com
去年用clojrue写的一个scheme解释器,基本是sicp书里的实现
在 2012年8月23日 下午5:16,Shen, Feng <she...@gmail.com>写道:

Ruiyun Wen

unread,
Aug 23, 2012, 5:31:21 AM8/23/12
to cn-cl...@googlegroups.com
你们也太给人压力了,这下子觉都睡不踏实了
320.gif

Shen, Feng

unread,
Aug 23, 2012, 5:30:58 AM8/23/12
to cn-cl...@googlegroups.com
就是看到你去年用clojure写过, 今年我用go来一次。 玩玩, 找点乐了。


沈锋
美味书签 http://mei.fm 



2012/8/23 dennis zhuang <killm...@gmail.com>

Shen, Feng

unread,
Aug 23, 2012, 5:35:03 AM8/23/12
to cn-cl...@googlegroups.com
这里有pdf的:

https://github.com/sarabander/sicp-pdf

沈锋
美味书签 http://mei.fm 



2012/8/23 Ruiyun Wen <ruiyu...@gmail.com>
320.gif

dennis zhuang

unread,
Aug 23, 2012, 5:42:46 AM8/23/12
to cn-cl...@googlegroups.com
用clojure学习sicp完全可以的,除了continuation没法搞之外,其他应该都可以。
320.gif

David Day

unread,
Aug 23, 2012, 5:43:17 AM8/23/12
to cn-cl...@googlegroups.com
感谢,我在amazon上买的

在 2012年8月23日 下午5:35,Shen, Feng <she...@gmail.com>写道:
320.gif

Shen, Feng

unread,
Aug 23, 2012, 5:44:02 AM8/23/12
to cn-cl...@googlegroups.com
王垠 的 文章,对sicp的评价

因为通常人们认为 Scheme 不是一个“实用”的语言,没有很多“库”可以用,效率也不高,而 Common Lisp 是“工业标准”,再加上 Paul Graham 文章的怂恿,所以我就开始了解 Common Lisp。在那段时间,我看了 Paul Graham 的 《On Lisp》 和 Peter Norvig 的 《Paradigms of Artificial Intelligence Programming》。怎么说呢?当时我以为自己学到很多,可是现在看来,它们教会我的并没有 《SICP》 的东西那么精髓和深刻。开头以为一山还有一山高,最后回头望去,其实复杂的东西并不比简单的好。现在当我再看 Paul Graham 和 Peter Norvig 的文章,就觉得相当幼稚了,而且有很大的宗教成分。

相信王垠,很佩服他。他这么说,就应该要好好读读sicp了,况且以前还读过Peter Norvig的文章,感觉很好

欢迎用我写的http://rssminer.net/ 订阅王垠文章

沈锋
美味书签 http://mei.fm 



2012/8/23 Shen, Feng <she...@gmail.com>
320.gif

Liutos

unread,
Aug 23, 2012, 5:44:45 AM8/23/12
to cn-cl...@googlegroups.com
跟用C写哪个比较有难度?

在 2012年8月23日 下午5:16,Shen, Feng <she...@gmail.com>写道:



--
Liutos Love Linux LaTeX Lisp Ling

我的GitHub主页:https://github.com/Liutos

Shen, Feng

unread,
Aug 23, 2012, 5:56:03 AM8/23/12
to cn-cl...@googlegroups.com
c可能会费力一点, c需要实现gc, go已经有gc了。

沈锋
美味书签 http://mei.fm 



2012/8/23 Liutos <mat.l...@gmail.com>

David Day

unread,
Aug 23, 2012, 5:57:29 AM8/23/12
to cn-cl...@googlegroups.com
用惯了java后,我就讨厌自己写gc了

legendsland lin

unread,
Aug 23, 2012, 6:54:00 AM8/23/12
to cn-cl...@googlegroups.com

SICP 必须要读,Clojure 的很多设计都是暗合其中的。此外,还推荐2篇文章:


High-order functions & Laziness 是模块化的核心要素。前者好理解点,laziness 之所以有助于模块化,因为它将 “生成” 和 “检验” 分开了。Laziness 能定义流结构(clojure 叫 lazy-seq),该结构的重要特性是将“变化的状态”完全地封装了进去,使得在代码中无须使用类似 set! 的状态变量,却能模拟现实中的状态,特别适用于并发处理。但是。。。并发处理与并行处理不是同一个概念,后者强调如何高效地利用多核计算。有意思的是,表/流结构有害于并行处理!那怎样才能既获得表/流的函数式优雅,又能写出能被并行优化的代码呢?于是,在5月份的时候 Clojure 1.5 中新增的 reducers ,就是为了不使用表/流结构却能定义出 map/filter 等,以便支持后续的 reduce/fold 并行处理。

SICP前4章其实就在说三个字:模块化。以上是个人看法,希望对阅读SICP有些帮助。


2012/8/23 Shen, Feng <she...@gmail.com>
320.gif

David Day

unread,
Aug 23, 2012, 7:36:02 AM8/23/12
to cn-cl...@googlegroups.com
clojure不是才到1.4么
320.gif

legendsland lin

unread,
Aug 23, 2012, 7:40:20 AM8/23/12
to cn-cl...@googlegroups.com
1.5.0 还在开发ing,现在到了alpha4

2012/8/23 David Day <dave...@gmail.com>
320.gif

hyper-carrot

unread,
Aug 23, 2012, 7:59:37 PM8/23/12
to cn-cl...@googlegroups.com
我昨天刚在微博上畅想着clojure-go,不错啊~,大家可以一起搞

Liutos

unread,
Aug 23, 2012, 10:37:00 PM8/23/12
to cn-cl...@googlegroups.com
用Clojure实现Go?!

Qiu Xiafei

unread,
Aug 23, 2012, 10:55:09 PM8/23/12
to cn-cl...@googlegroups.com
go实现的clojure吧。。。

2012/8/24 Liutos <mat.l...@gmail.com>

wanglihe

unread,
Aug 24, 2012, 5:53:25 PM8/24/12
to cn-cl...@googlegroups.com
王垠还说,sicp里的实现不好。所以,他单列了一篇讲实现的。不过,他好像没说哪个实现更好。
还有一点缺憾,他的感兴趣的方向明明有并行计算,但是他暂时还没有之方面的论述。我一直在想,是不是实现cas这一基本语义,就可以安全并发。理论功底不如人家啊,不知道这东西能不能用数学工具推出来,也不知道这个东西是不是最基本的。

wanglihe

unread,
Aug 24, 2012, 5:58:48 PM8/24/12
to cn-cl...@googlegroups.com
学vim,找易水;学lisp,看冰河。
《on lisp》也许是当下的选择。
冰河有中译本,找找看~~

wanglihe

unread,
Aug 24, 2012, 6:08:53 PM8/24/12
to cn-cl...@googlegroups.com
http://www.scheme.com/tspl4/
这本也许也可以试试。我没看过,记得别人说过好,纯转发。


On Thursday, August 23, 2012 2:59:53 PM UTC+8, David Day wrote:

wanglihe

unread,
Aug 24, 2012, 6:12:04 PM8/24/12
to cn-cl...@googlegroups.com
c的话,有参考。guile就是用c实现的。

wanglihe

unread,
Aug 24, 2012, 6:12:04 PM8/24/12
to cn-cl...@googlegroups.com
c的话,有参考。guile就是用c实现的。

On Thursday, August 23, 2012 5:44:45 PM UTC+8, 刘滔 wrote:

Liutos

unread,
Aug 24, 2012, 9:45:28 PM8/24/12
to cn-cl...@googlegroups.com
王垠好像说过并行计算也有理论方面的东西,叫π-calculus

David Day

unread,
Aug 25, 2012, 2:31:40 PM8/25/12
to cn-cl...@googlegroups.com
我刚刚看了下golang,感觉用这个语言写代码,看起来会很丑。

在 2012年8月23日星期四UTC+8下午5时21分19秒,Feng Shen写道:

jaime

unread,
Aug 26, 2012, 10:05:37 PM8/26/12
to cn-cl...@googlegroups.com
个人认为 SICP + Scheme 是FP入门最好的途径。对于FP和动态语言,从真正使用过的语言来说,我觉得从简洁优雅来说是: Scheme > Lua > Clojure,而实用性方面则刚好相反。

当初我看了一下Scheme之后尝试去看CL,发现CL还是比较晦涩难懂,所以干脆没看CL了,然后一直找一门可以兼顾实用和优雅的语言,(也稍微比较过一下Scalar和Groovy)最后觉得Clojure 应该是比较合适的……当然每个人的喜好和学习方法都不一样,找到适合自己的最好。

在 2012年8月23日星期四UTC+8下午2时40分34秒,David Day写道:
感觉比c-lisp清晰

David Day

unread,
Aug 26, 2012, 10:13:17 PM8/26/12
to cn-cl...@googlegroups.com
就我个人感觉来说,拥有太多特殊的方言和语法糖的scala,并不是一个好的选择。

Liutos

unread,
Aug 26, 2012, 10:17:15 PM8/26/12
to cn-cl...@googlegroups.com
把Scala当成JVM平台上的OCaml好了……

一开始就看CommonLisp,反而没有觉得CL晦涩过,并且有些特性其它语言也没有,很好玩~

David Day

unread,
Aug 26, 2012, 10:20:28 PM8/26/12
to cn-cl...@googlegroups.com
那可能是我买的那本书讲的不好,讲完之后,我都没理解宏到底怎么用。

Lihe Wang

unread,
Aug 26, 2012, 10:22:22 PM8/26/12
to cn-cl...@googlegroups.com
整体而言,我个人非常赞同有一个官方级别的语法糖的存在。比如scala。语法糖可以很好的减少代码,增加可读性,但是如果语言级只提供了语法糖的支持,但反而没有一个强人或是好的团队设计优秀的语法糖,那才是语法方言的灾难。

在 2012年8月27日 上午10:13,David Day <dave...@gmail.com>写道:

David Day

unread,
Aug 26, 2012, 10:26:05 PM8/26/12
to cn-cl...@googlegroups.com
scala的语法糖很多地方让代码更加模糊,比如用下划线代替变量,为其他类绑定方法。
还有就是一些常规用法可能导致性能下降,比如用to或者until迭代。

Liutos

unread,
Aug 27, 2012, 2:35:37 AM8/27/12
to cn-cl...@googlegroups.com
赞成!CL的很多库提供语法糖,但是因为这些语言糖仅仅是由第三方库来决定的,所以很难保证各个库在语法糖的选择上保持一致或者不会造成冲突。但是其实很多时候一些通用的功能(大部分应用都需要的那种),如果语言标准可以提供明确的语法糖,那么各个库用起来就没那么不一致了~

在 2012年8月27日 上午10:22,Lihe Wang <wanglihe....@gmail.com>写道:

Bill Liao

unread,
Aug 27, 2012, 2:48:59 AM8/27/12
to cn-cl...@googlegroups.com
Scala的implicit有时候确实让人崩溃。。其他sugar倒也没啥。
regards




2012/8/27 Liutos <mat.l...@gmail.com>

Lihe Wang

unread,
Aug 27, 2012, 6:29:22 AM8/27/12
to cn-cl...@googlegroups.com
单论scala的语法糖的话,那只能说是萝卜白菜的问题了。下划线在erlang里甚至是可忽略变量的起始字符,看多了就习惯了。

至于性能下降我就没什么经验了,不好说,但从理论上来说,语法会导致性能下降的可能性微乎其微,除非编译器写得不好。

Shouxun Yang

unread,
Aug 28, 2012, 4:12:26 AM8/28/12
to cn-cl...@googlegroups.com
早年我也是更喜爱Scheme语言的简单、优美,看国外的很多大学课程也是用Scheme示例的而不是用Common
Lisp示例的,包括前面大家提到的SICP在内的很多著名教材也是用Scheme。Dybvig的The Scheme Programming
Language也可以免费下载、学习。就快速学习Lisp语言的基础而言,从Scheme入手确实不错。

真到自己写程序时发觉还是Common
Lisp方便,这毕竟是Lisp业界标准,很多东西都已经有现成的函数、宏或者我知名的第三方库。Common
Lisp方面的著名教材也有好几本,后来又陆续出版了一些新的。

不过现在的环境跟那时已经有了很大的变化。无论Scheme还是Common
Lisp都有了更多的开源库可用。喜欢Scheme的可以考虑Racket,喜欢Common
Lisp的SBCL+Quicklisp是不错的组合。

个人现在很看好Clojure,虽然对我这个缺乏Java经验的人来说有时也感觉不爽,这个只有个人慢慢适应。

对于已经有一定的Java基础的人,接着学习Clojure应该是不错的选择。

2012/8/27 Lihe Wang <wanglihe....@gmail.com>:

David Day

unread,
Aug 28, 2012, 4:15:39 AM8/28/12
to cn-cl...@googlegroups.com
我学scheme只要是为了看《计算机程序的构造和解释》,再说现在也没有clojure的中文书。

帝归

unread,
Aug 28, 2012, 4:19:08 AM8/28/12
to cn-cl...@googlegroups.com
http://code.google.com/p/clojure-doc-en2ch/

这个项目还有人维护没?
--
‘(hello world)

David Day

unread,
Aug 28, 2012, 4:22:28 AM8/28/12
to cn-cl...@googlegroups.com
http://www.douban.com/group/topic/27055568/ 
这个人貌似已经放弃了

Ruiyun Wen

unread,
Aug 28, 2012, 4:27:43 AM8/28/12
to cn-cl...@googlegroups.com
sicp这个中文版翻译的,还真是让人七窍生烟啊,可惜了。

在 2012年8月28日 下午4:15,David Day <dave...@gmail.com>写道:

David Day

unread,
Aug 28, 2012, 4:29:18 AM8/28/12
to cn-cl...@googlegroups.com
挺难懂的,这些人翻译总是感觉怪怪的。

naitong Xiao

unread,
Aug 28, 2012, 6:31:20 AM8/28/12
to cn-cl...@googlegroups.com
scip的中文版还好吧, 除了第二章图形语言那一小节翻译的有些别扭
基本上熟悉了译者对相关术语的翻译,后面会越读越顺畅,要坚持住!

Lisp相关图书中文版目前市面上的评价都不是太高, 期待正在翻译中的几本clojure图书

naitong Xiao

unread,
Aug 28, 2012, 6:47:54 AM8/28/12
to cn-cl...@googlegroups.com
顺道问一下谁又reasoned schemer 这本书电子版, 看完sicp第四章对logic programming很感兴趣

Liutos

unread,
Aug 28, 2012, 7:30:21 AM8/28/12
to cn-cl...@googlegroups.com
最近折腾Java,感受到了Java强大的文档,忽然想折腾Clojure了XD

在 2012年8月28日 下午4:12,Shouxun Yang <yang.s...@gmail.com>写道:

帝归

unread,
Aug 28, 2012, 7:35:47 AM8/28/12
to cn-cl...@googlegroups.com
赶紧的!枉费我这么多口水!
--
‘(hello world)

子胖子

unread,
Aug 28, 2012, 9:06:23 AM8/28/12
to cn-cl...@googlegroups.com
同求啊,特别是看了sicp后还很迷糊,感觉像schemer系列这样的走过一遍就会很清晰了

Liutos

unread,
Aug 28, 2012, 10:41:43 AM8/28/12
to cn-cl...@googlegroups.com
我真的有很多别的事情做的嘛~例如吃饭啦睡觉啦发呆啦……

Zhaolong Zhu

unread,
Aug 28, 2012, 11:36:47 PM8/28/12
to cn-cl...@googlegroups.com
http://ishare.iask.sina.com.cn/f/7895557.html 可以看看这个链接。

David Day

unread,
Aug 28, 2012, 11:39:40 PM8/28/12
to cn-cl...@googlegroups.com
英文看起来好吃力啊

Liutos

unread,
Aug 29, 2012, 2:57:36 AM8/29/12
to cn-cl...@googlegroups.com
看多了就习惯了,coder还是应该努力修炼一下英文能力的:-)

崔钢

unread,
Aug 29, 2012, 7:00:55 AM8/29/12
to cn-cl...@googlegroups.com
学clojure是我觉得这是唯一可以用在工作中的lisp语言。

--
Writing on Valuable Thing of Life

lbt0506

unread,
Aug 29, 2012, 7:09:12 AM8/29/12
to cn-cl...@googlegroups.com

顶楼上
顺便打个广告:我们是一家阳光下的Clojure公司

lbt05
send from my phone

Shen, Feng

unread,
Aug 29, 2012, 8:08:27 AM8/29/12
to cn-cl...@googlegroups.com
说到阳光,就让我想起了往事,想起了共党,不觉黯然啊

沈锋
美味书签 http://meiwei.fm 



2012/8/29 lbt0506 <lbt...@gmail.com>

Liutos

unread,
Aug 29, 2012, 9:29:22 AM8/29/12
to cn-cl...@googlegroups.com
只能说找工作机会相对大,Scheme和CL也照样能在工作中用啊~

帝归

unread,
Aug 29, 2012, 9:51:31 AM8/29/12
to cn-cl...@googlegroups.com
我就在工作中偷偷用了Common Lisp,用来生成其它代码
--
‘(hello world)

Lihe Wang

unread,
Aug 29, 2012, 8:13:22 PM8/29/12
to cn-cl...@googlegroups.com
同道中人啊。我也只能偷偷的用一些好技术,因为其他人不对好技术感兴趣,只对会了的技术感兴趣,还动不动只要一门精通即可。不说一门都通不了,本身逻辑也说不过去,因为他们的理论连编译器都是多余的。

David Day

unread,
Aug 29, 2012, 8:32:43 PM8/29/12
to cn-cl...@googlegroups.com
我曾经想在项目中使用scala写框架,但是项目经理不准

Shen, Feng

unread,
Aug 29, 2012, 9:10:00 PM8/29/12
to cn-cl...@googlegroups.com
我们这个小公司,用新技术是被鼓励的。 我们需要的是搞定问题。 你能搞定。
无耻小广告: http://team.mei.fm/career/


沈锋
美味书签 http://meiwei.fm 



2012/8/30 Lihe Wang <wanglihe....@gmail.com>

David Day

unread,
Aug 29, 2012, 11:10:51 PM8/29/12
to cn-cl...@googlegroups.com
现在这家公司我准备偷偷的用

崔钢

unread,
Aug 29, 2012, 11:25:16 PM8/29/12
to cn-cl...@googlegroups.com
这就是在中国黑客的可悲之处。我也一样。不被人所理解。

Albert Lee

unread,
Aug 29, 2012, 11:32:07 PM8/29/12
to cn-cl...@googlegroups.com
在Java主导的公司里用 clojure 还算正常。
scheme 是好懂些,不过实际开发上,我还是更看好Common Lisp。

借用 Let Over Lambda 里面吐槽的一句:Scheme programmers like to talk about how
great it is to have a short specification; CL programmers like to
write programs.

最近一直在读 LOL ,读得很艰难,看来还是需要再多实际写点CL代码再读的好。


2012/8/30 David Day <dave...@gmail.com>:

帝归

unread,
Aug 29, 2012, 11:34:24 PM8/29/12
to cn-cl...@googlegroups.com
期待韩大的新CL项目!
--
‘(hello world)

Albert Lee

unread,
Aug 29, 2012, 11:34:43 PM8/29/12
to cn-cl...@googlegroups.com
我现在的人生目标就是拿到第一桶金后,自己搞个小项目去用LISP来写。就算赚不到钱至少不会赔多少。


2012/8/30 崔钢 <clark...@gmail.com>:

帝归

unread,
Aug 29, 2012, 11:39:03 PM8/29/12
to cn-cl...@googlegroups.com
支持!像我这种Lisp脑残粉是所有Lisp都在看,目前最感兴趣的还是Clojure了=。=
--
‘(hello world)

Shen, Feng

unread,
Aug 29, 2012, 11:41:21 PM8/29/12
to cn-cl...@googlegroups.com
理想青年。 
好样的。  

沈锋
美味书签 http://shenfeng.me



2012/8/30 Albert Lee <hanzh...@gmail.com>

naitong Xiao

unread,
Aug 30, 2012, 12:18:17 AM8/30/12
to cn-cl...@googlegroups.com
有些兴趣,请问你们昆山有开发的职位吗?

naitong Xiao

unread,
Aug 30, 2012, 12:25:31 AM8/30/12
to cn-cl...@googlegroups.com
这本是seasoned schemer, 我说的是reasoned schemer
看来只能在amazon上买了

Ruiyun Wen

unread,
Aug 30, 2012, 12:43:25 AM8/30/12
to cn-cl...@googlegroups.com
我在的也是一家Clojure可以生活在阳光下的公司。不过因为是家族企业,封闭且文化较弱,怕发小广告误毁了有志好青年。

Shen, Feng

unread,
Aug 30, 2012, 12:50:09 AM8/30/12
to cn-cl...@googlegroups.com
没有了

沈锋
美味书签 http://shenfeng.me


2012/8/30 naitong Xiao <xiaon...@gmail.com>

Liutos

unread,
Aug 30, 2012, 1:55:06 AM8/30/12
to cn-cl...@googlegroups.com
脑残粉→_→总之力挺韩大哥~

Lihe Wang

unread,
Aug 30, 2012, 7:01:58 AM8/30/12
to cn-cl...@googlegroups.com
友情推一个:
喜欢scala的话,有一家可以远程办公的公司可以试试,其实也比较有名啦
http://www.rememberthemilk.com/about/jobs.rtm

我可没加入,具体信息别问我,纯推荐。看招聘启示,感觉起来不错。因为可以远程工作,应该也比较适合国内的高手。

David Day

unread,
Aug 30, 2012, 7:20:00 AM8/30/12
to cn-cl...@googlegroups.com
我不喜欢scala才来看clojure的,scala里很多地方设计的容易混淆,或者为了函数式而设置了一些障碍

Lihe Wang

unread,
Aug 30, 2012, 7:34:24 PM8/30/12
to cn-cl...@googlegroups.com
喜好方面我就不关心了,能不能举一个“为了函数式而设了置了一些障碍”具体例子。scala莫非有意只使用函数式,而将命令式的干掉了?

David Day

unread,
Aug 30, 2012, 8:46:34 PM8/30/12
to cn-cl...@googlegroups.com
最显著的莫过于scala的list,是一个不可变的队列,比数组还死。长度不可变,元素也不可变。scala对list做的比如++之类方法,都是产生一个新的list。

还有就是刚转到scala的时候,很不习惯没有break和continue的循环。
java代码
val canNext = true
for (int i = 0; i < 10; i++) { 
  if (....)  continue
  if (....) break
  .....代码块....
}
scala代码
var  mustBreak = false
var  mustContinue = false;
for (
  i <- 1 to 10
  !mustBreak  
) {
  if (....)  { // 用作 continue 
    if (....) { // 用作 break
      mustBreak  = true;
    } else {
      .....代码块....
    }
  }
}
这样的写法把我恶心坏了

Liutos

unread,
Aug 30, 2012, 10:04:52 PM8/30/12
to cn-cl...@googlegroups.com
其实我一直觉得非Lisp系的语言提供列表并且不同于数组类型没什么必要~如果Scala支持尾递归优化,那么把这类循环给成递归应该就可以漂亮地表达break和continue了~

David Day

unread,
Aug 30, 2012, 10:14:10 PM8/30/12
to cn-cl...@googlegroups.com
的确是的,而且非lisp语言没必要强烈推崇递归,比如scala,这些语言更适合循环。
scala很多语法相当奇怪,有对java的优化,有硬往函数式上套。
很多地方看起来相当绕人,比如对于方法、泛型和可变参数的调整,这些所谓的改进给我的感觉就是不断重新发明轮子。
还有我说的性能问题,参考Yammer从Scala转向Java的例子:

Lihe Wang

unread,
Aug 31, 2012, 12:37:32 PM8/31/12
to cn-cl...@googlegroups.com
呵呵,这样的写法谁都恶心。但是,很不幸,这不是scala的错。

关于新建list的性能问题,我个人没有深究过,所以,不太清楚,但从一般“不可变”列表的实现上来说,性能应该都还可以,没有大量的创建与销毁,创建销毁的是引用,很轻量。

至于代码吧,这段代码的正确写法应该是(scala语法忘了,看个大概吧):

func  change_some_head(list, check_func, map_func, stop):
     for { i <- list.toStream.takeWhile(x => not stop(x))
            if check_func(i)
          } yield map_func(i)

主循环就这么短,4行,check和map两个函数多长那就不是for的问题了。所以整体上,比java还是紧凑得多的,强制功能代码分离,模块化方面也好得多。

在 2012年8月31日 上午8:46,David Day <dave...@gmail.com>写道:

David Day

unread,
Aug 31, 2012, 1:43:51 PM8/31/12
to cn-cl...@googlegroups.com
其实我不想写个循环还弄个模块化,这样感觉不好,也没必要……
这就是我说的scala为了函数式而人为制造的障碍,是否应该模块化分离代码,需要根据实际情况而判断,而不是语言迫使你这样做。
有时候java一段代码写完之后加几行注释就搞定的地方,到了scala里却要分成几个函数,查看源代码的时候还要跳来跳去看看这几段到底怎么回事,有点像看spring、hibernate之类框架源码的感觉,绕来绕去。如果你胆敢不按照scala推荐的做法,你的代码看起来就会异常丑陋。项目写的越大,这个问题越明显。

还有各种性能突然变慢,就拿他的例子来看吧,这段代码有些语法错误,不过大概明白意思就够了。
我只不过是循环一个列表,并且加几个判断。
for (Object element : list) {
if (...) continue
......
}
但是用scala写起来是这样,这中间做了很多事, list.toStream.takeWhile至少多生成2个集合Stream,完全是多余的。这在写实现的时候还好,如果你胆敢用来写框架,呵呵。
def  change_some_head(list, check_func, map_func, stop):
     for ( i <- list.toStream.takeWhile(x => !stop(x))
            if check_func(i)
         ) yield map_func(i)
至于for的诡异效率问题,参考http://my.oschina.net/qinhui99/blog/56876

Lihe Wang

unread,
Aug 31, 2012, 9:31:53 PM8/31/12
to cn-cl...@googlegroups.com
汗~~

不想模块化和通用化代码,那么不喜欢scala就不喜欢吧。但是,这不是任何语言的问题,是人的问题,有个人喜好的成份,只能说,与函数式语言的优雅无缘了。如果以这种要求来说scala不好,那就好比说苹果为不什么能像橘子那样剥皮吃,所以苹果肯定不好吃一样,没有意义。我原本以为scala本质方面的有某些硬伤,比如理论上某种特别功能,使整个系统无法优化的变慢,比如java引入gc这种延时性资源回收,本质上高压力下更容易出现性能抖动,至少目前你还没给出任何一个。

至于你转那篇帖子,原帖2楼楼主自己给出了list慢的原因,真是自己打脸。那大哥完全就不明白list本该怎么用,所有语言的list都不该这么用,就是用 c++的list,什么common lisp还是clojure的list,这种用法一样慢,还怪人家性能差,用开车的方法开飞机,还说飞机那翅膀太碍事,飞机为什么跑那么慢,又只能在专用跑道上跑,这种帖子最好少看。

Shen, Feng

unread,
Aug 31, 2012, 9:55:55 PM8/31/12
to cn-cl...@googlegroups.com
语言之争,这是一场耗时耗力,但意义甚微的东西。个人偏好,堪比宗教信仰。

每个语言都有它的idiomatic的东西,需要花时间去想,去思考,去做。比如你以前很熟悉一门语言,遇到一门新语言,就可能会有不习惯的地方。你写起来很不爽的地方。熟悉这门语言的人也会觉得那样不爽, 他们可能还会吃惊,为什么要这么写。 这也是我为什么喜欢bruce eckel 的thinking in XX的书的原因。

我没有怎么看过scala,不过别人的评价还是很高的。

James Strachan, the creator of Groovy, described Scala as a possible successor to Java. 



沈锋
美味书签 http://shenfeng.me



2012/9/1 Lihe Wang <wanglihe....@gmail.com>

legendsland lin

unread,
Aug 31, 2012, 10:08:41 PM8/31/12
to cn-cl...@googlegroups.com

九月了,“月经”该来了


2012/9/1 Shen, Feng <she...@gmail.com>

Liutos

unread,
Aug 31, 2012, 10:46:40 PM8/31/12
to cn-cl...@googlegroups.com
这个是从8月份跳进来的月经贴啊,不过貌似一到九月一号就变语言战贴了;-)

Lihe Wang

unread,
Aug 31, 2012, 11:27:15 PM8/31/12
to cn-cl...@googlegroups.com
我看过的语言也许不算多,但也不算少,就算有宗教倾向的话,也是相当少的,因为信过的“教”太多了,哈哈。

我基本都是看语言基础功能组件,还关注与其他系统的沟通能力,这才是评价语言好坏的基本面。我很不喜欢打什么语言战争,当然也知道它没用,但是看一个基督徒指责佛教徒“我不入地狱谁入地狱”,这种完全骂错了方向的指责,还是很不爽。如果能给他们沟通,讲清楚,你们的地狱不是同一个地狱,我还是很愿意的。当他们发现各自的不同,自己去选择,你入你的天堂,我入我的地狱,才是好的。

总之一句话,如果有本质的,比如“lisp括号太多,虽然有好处,但是我用着就是不爽”,我是绝不反驳的,但是“lisp括号太多影响了软件的稳定性和速度”,这是没法接受的。毕竟,“有没有语法糖和喜不喜欢某一种语法糖是两回事”。如果骂错了方向,那还是要好好的辩一辩。

Liutos

unread,
Sep 1, 2012, 2:00:31 AM9/1/12
to cn-cl...@googlegroups.com
在 2012年9月1日 上午11:27,Lihe Wang <wanglihe....@gmail.com>写道:
我看过的语言也许不算多,但也不算少,就算有宗教倾向的话,也是相当少的,因为信过的“教”太多了,哈哈。

我基本都是看语言基础功能组件,还关注与其他系统的沟通能力,这才是评价语言好坏的基本面。我很不喜欢打什么语言战争,当然也知道它没用,但是看一个基督徒指责佛教徒“我不入地狱谁入地狱”,这种完全骂错了方向的指责,还是很不爽。如果能给他们沟通,讲清楚,你们的地狱不是同一个地狱,我还是很愿意的。当他们发现各自的不同,自己去选择,你入你的天堂,我入我的地狱,才是好的。

这宗教比喻太恰当了哈哈,没错,应该反对的是因为个人喜好而发起的不恰当的争论,尤其是逻辑上不太对的时候。

David Day

unread,
Sep 1, 2012, 2:38:21 AM9/1/12
to cn-cl...@googlegroups.com
不是不想通用化和模块化,而是没必要每个地方都这样。有些函数本来就十来行,非要拆成3、4个函数,而且这些拆出来的函数又无法复用到其他的地方。我不觉得这是优雅,就和把“我今晚在家吃饭”拆成“人物是我”、“时间是今晚”、“地方是家里”、“做的事情是吃饭”。我承认这样很清晰、很明白、很啰嗦。

我之前就说了,不是本质上的会导致变慢,而是scala推荐的一些常用写法和常用库会导致系统变慢。

还有我不认为他自己的回答是打脸,一个长度不可变的list,完全以链表来设计本身就是一个很诡异的事情。那这样一个list和array相比,有什么理由让我非要用它?首先长度都是不可变的,然后迭代的效率差不多,最后就是获取其中任意一个元素的时候array比list有效率的多。难道就因为list完不可变,我就应该抛弃array选择list?

Lihe Wang

unread,
Sep 1, 2012, 5:43:22 AM9/1/12
to cn-cl...@googlegroups.com
第一个问题,我同意。太短的我一般也是用拉姆达表达式内嵌,函数式一般这是这个风格,不喜欢也没什么。

第二个问题,我没具体测试,但是也没有见到令人信服的数据。

第三个问题,就很关键了。这是一个深度优化的问题,我来解释一下。不要眼见到一个列表可以用下标取元素,就觉得它可以用随机存储(比如数组)来模拟。它们的应用是不一样的,区别在于数据重用。当大量数据有很多重复的时候,共享数据是工程上很好的解决方案。数据不可变性,可以使同一分数据在多个执行序中共享而不会有任何问题。scala基于此,选择不可变的列表做为通用数据存储结构。不变性比较好理解,我就不说了。列表的数据共享体现在多个列表可以有不同的头,但是共享同一个尾。如list1::list0 和 list2::list0可以生成两个新列表(::运算符是连接两个列表的意思),但是如果list1和list2不等长,就失去了随机寻址的能力。但是这个时候,如果使用迭代访问的话,编译器可以将list0在内存中共享一份,而不造成性能的任何损失。这是工程上一个很好的方式,但是代价是失去了两个新列表的随机寻址能力。这个特性所使用的场景工程上随处可见,可以极大的节约内存,申请内存的操作少了,甚至会提升部分性能。所以,这明明是一个好特性,因为不理解其功用反而说性能降低了,发那帖子的楼主怕是要贻笑大方了。话说回来,非要比随机访问速度的话,至少应该数组对数组才公平吧?scala也有vector类型,可以拿这个比比,我估计和java的数组速度上是同一个数量级的,并且都是常量。拿O(n)的访问跟O(1)的访问比,本来就不公平,如果性能只下降了一半,我还想说scala真TM快呢。

Lihe Wang

unread,
Sep 1, 2012, 6:03:51 AM9/1/12
to cn-cl...@googlegroups.com
您是明白人儿呀
328.png

Qihui Sun

unread,
Sep 1, 2012, 7:17:57 AM9/1/12
to cn-cl...@googlegroups.com
学习Scala有几年了,对于它的lists设计还是蛮认可的。Scala没有逼谁一定在任何场合下使用lists,如果性能至关重要,也可以用array.lists是FP里面的主要构造之一,有数十年的成熟的经验,Scala支持得还是蛮好的,结合模式匹配与list comprehension,威力强大。
另外,赞同楼上的观点。
--
Solomon
Google+: Qihui Sun



328.png

Liutos

unread,
Sep 1, 2012, 9:36:14 AM9/1/12
to cn-cl...@googlegroups.com
我觉得列表这种东西的强项在于_递归_!如果是为了随机存取而使用的数据结构,当然是数组更好。
328.png

legendsland lin

unread,
Sep 1, 2012, 12:56:25 PM9/1/12
to cn-cl...@googlegroups.com


华为还有部门再用 scala 啊?不知道是做什么的?

这里有一个 clojure, scala 的帖子,吐槽 scala 的部分: 

It has a C++ like reputation for being fully understood only by guru level developers. One of it's key features is a type system that is Turing complete in itself.

Scala 有像 C++ 那种(模板)类型推导机制?还是图灵完备的...  吓人了

Scala 继承于 ML;就像 Clojure 继承于 Lisp。ML 是类型推导语言的鼻祖,就像Lisp是函数式语言的鼻祖。本无太多瓜葛... 不过 scala 和 clojure 的绝对共同点是依靠Java,将学院派性质的语言实践化。




2012/9/1 Qihui Sun <qihu...@gmail.com>
另外,赞同楼上的观点。
328.png

Jiyin Yiyong

unread,
Oct 2, 2012, 9:41:04 AM10/2/12
to cn-cl...@googlegroups.com
纠结于楼上因何而信念如此坚定, 虔诚请教 : )

Yu Gadmyth

unread,
Jan 29, 2013, 3:36:26 AM1/29/13
to cn-cl...@googlegroups.com
因为scheme和common lisp的体系不一样,scheme是lisp1, common lisp是体系2

On Thursday, August 23, 2012 2:40:34 PM UTC+8, David Day wrote:
感觉比c-lisp清晰

Yu Gadmyth

unread,
Jan 29, 2013, 3:49:46 AM1/29/13
to cn-cl...@googlegroups.com
http://sicpinclojure.com/

On Thursday, August 23, 2012 5:42:46 PM UTC+8, dennis wrote:
用clojure学习sicp完全可以的,除了continuation没法搞之外,其他应该都可以。

在 2012年8月23日 下午5:35,Shen, Feng <she...@gmail.com>写道:
这里有pdf的:

https://github.com/sarabander/sicp-pdf

沈锋
美味书签 http://mei.fm 



2012/8/23 Ruiyun Wen <ruiyu...@gmail.com>
你们也太给人压力了,这下子觉都睡不踏实了

在 2012年8月23日 下午5:26,dennis zhuang <killm...@gmail.com>写道:

去年用clojrue写的一个scheme解释器,基本是sicp书里的实现

https://github.com/killme2008/cscheme

在 2012年8月23日 下午5:16,Shen, Feng <she...@gmail.com>写道:
我也在读。 刚开始。  
还打算用go实现一个lisp interpreter, 看看感觉。

沈锋
美味书签 http://mei.fm 



2012/8/23 David Day <dave...@gmail.com>
这本书我刚入手,正在看。

在 2012年8月23日 下午5:03,Ruiyun Wen <ruiyu...@gmail.com>写道:

我也在看sicp,只是各种事情很多,阅读进度就很慢。
真的推荐大伙儿没事的时候看看。

在 2012年8月23日 下午2:59,David Day <dave...@gmail.com>写道:

我现在需要的不是实用,而是深入理解lisp

在 2012年8月23日 下午2:58,dennis zhuang <killm...@gmail.com>写道:

那我推荐你看clojure,更实用一些。

在 2012年8月23日 下午2:40,David Day <dave...@gmail.com>写道:
感觉比c-lisp清晰



--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008










--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008








--
庄晓丹
Email:        killm...@gmail.com xzh...@avos.com
Site:           http://fnil.net
Twitter:      @killme2008



Reply all
Reply to author
Forward
0 new messages