Racket是Scheme的后代.Racket与R6RS有何不同?它添加或带走了什么,或者只是不同?
据我所知,Racket不仅仅是一种语言,它还是一种语言平台.但我指的是主要的球拍方言.
我知道他们是同一个语言家族的方言,称为lisp,但究竟是什么区别呢?如果可能,您是否可以概述语法,特征,功能和资源等主题.
我正在寻找一个Scheme或甚至LISP的版本,我可以用它来恢复一些失去的Lisp开发技巧.一些Web功能会很好,但不是必需的.
我看过Plt和MIT方案,虽然两者看起来都不错,但Plt看起来更加丰富.我也看了Lisp实现,但所有看起来都很昂贵.
我赞成免费/廉价的实现,因为这可能只是偶尔的业余爱好编程.你有什么建议?
注意:我不是在问哪个学习,哪个更好,或者类似的东西.
我拿起SICP的免费版本,因为我觉得阅读会很好(我听说过很好的东西,而且我对这种编程方面很感兴趣).
我知道Scheme是Lisp的一种方言,我想知道:Scheme和Common Lisp之间的实际区别是什么?
似乎有很多关于'CL有一个更大的stdlib ...方案对现实世界的编程不好......'但实际上并没有说'这是因为CL就是这个/有这个'.
我对Macros非常感兴趣,刚刚开始了解它的真正力量.请帮我收集宏系统的一些很好的用法.
到目前为止,我有这些结构:
模式匹配:
安德鲁赖特和布鲁斯杜巴.Scheme的模式匹配,1995
Prolog精神的关系:
Dorai Sitaram.在schelog中编程. http://www.ccs.neu.edu/home/dorai/schelog/schelog.html
Daniel P. Friedman,William E. Byrd和Oleg Kiselyov.理性的计划者.麻省理工学院出版社,2005年7月
Matthias Felleisen.将Prolog音译为方案.技术报告182,印第安纳大学,1985年.
可扩展循环结构:
塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计."计划与功能规划研讨会",2005年9月第13-26页.
奥林颤抖.循环的解剖:范围和控制的故事.在国际功能规划会议,第2-14页,2005年.
班级系统:
PLT.PLT MzLib:图书馆手册.技术报告PLT-TR2006-4-v352,PLT方案公司,2006年 http://www.plt-scheme.org/techreports/
Eli Barzilay.骗取. http://www.barzilay.org/Swindle.
组件系统:
Ryan Culpepper,Scott Owens和Matthew Flatt.组件接口中的语法抽象.在生成编程和组件工程国际会议,第373-388页,2005年
软件合同检查
Matthew Flatt和Matthias Felleisen.单位:用于HOT语言的酷模块在ACM SIGPLAN会议上编程语言设计和实现,第236-248页,1998年
Oscar Waddell和R. Kent Dybvig.扩展句法抽象的范围.在编程语言原理研讨会上,第203-215页,第199页
解析器生成器
Scott Owens,Matthew Flatt,Olin Shivers和Benjamin McMullan.Scheme中的Lexer和解析器生成器.关于计划和功能规划研讨会,2004年9月第41-52页.
工程语义工具:
Matthias Felleisen,Robert Bruce Findler和Matthew Flatt.PLT Redex的语义工程.MIT出版社,2009年8月.
编译器转换的规范:
Dipanwita Sarkar,Oscar Waddell和R. Kent Dybvig.用于编译器教育的纳米框架.功能规划期刊,15(5):653-667,2005年9月.教育明珠.
新的执行形式
具有可序列化延续的Servlet Greg Pettyjohn,John Clements,Joe Marshall,Shriram Krishnamurthi和Matthias Felleisen.广义堆栈检查的延续.在国际功能规划会议上,第216-227页,2005年.
定理证明系统
塞巴斯蒂安·埃格纳 方案中的热切理解:SRFI-42的设计.在计划与功能规划研讨会上,2005年9月第13-26页.
基类的扩展与类型
Sam Tobin-Hochstadt和Matthias Felleisen.打字方案的设计和实施.在编程语言原理研讨会上,第395-406页,2008年.
怠惰
Eli Barzilay和John Clements.没有辛勤工作的懒惰:将懒惰和严格的语言结合起来进行教学.在教育中的功能和声明性编程中,第9-13页,2005年. …
在Haskell中,与许多其他函数语言一样,函数foldl
被定义为例如foldl (-) 0 [1,2,3,4] = -10
.
这没关系,因为foldl (-) 0 [1, 2,3,4]
根据定义,((((0 - 1) - 2) - 3) - 4)
.
但是,在Racket中,(foldl - 0 '(1 2 3 4))
是2,因为Racket"智能地"计算如下:(4 - (3 - (2 - (1 - 0))))
,确实是2.
当然,如果我们定义辅助功能翻转,像这样:
(define (flip bin-fn)
(lambda (x y)
(bin-fn y x)))
Run Code Online (Sandbox Code Playgroud)
然后我们可以在Racket中实现与Haskell相同的行为:而不是(foldl - 0 '(1 2 3 4))
我们可以写:(foldl (flip -) 0 '(1 2 3 4))
问题是:为什么foldl
球拍以这种奇怪的(非标准的,非直观的)方式定义,与其他语言不同?
我和The Little Schemer一起工作,学习Scheme并在我的环境中使用PLT-Scheme.
Little Schemer对递归给了我很大的帮助(现在对我来说很简单)但是我仍然坚持介绍"收藏家"这本书的一部分,并将整个函数称为一个延续.
这是他们使用的示例代码.我理解递归元素但是我被卡住了,特别是在lambda函数上 - 我的思想不能遵循路径以及如何设置lambda函数的参数(因为他们唯一的调用是在递归中再次调用它们,有功能体内没有具体用途).
如果有人能够或多或少地通过将函数递归到lambda收集器来分解计算路径,那可能对我有所帮助.
;; Build a nested list of even numbers by removing the odd ones from its
;; argument and simultaneously multiply the even numbers and sum the odd
;; numbers that occur in its argument.
(define (even-only-collector l col)
(cond
((null? l)
(col (quote ()) 1 0))
((atom? (car l))
(cond
((even? (car l))
(even-only-collector (cdr l)
(lambda (newl p s)
(col (cons (car l) newl)
(* (car l) …
Run Code Online (Sandbox Code Playgroud) 为了全能的爱,我还没有理解符号的目的'iamasymbol
.我理解数字,布尔值,字符串...变量.但是符号对于我的小思维思维来说太过分了.我究竟用它做什么用的?它们应该如何在程序中使用?我对这个概念的把握只是失败了.
我知道你可以使用'
(aka quote
)创建一个列表,我一直都在使用它,如下所示:
> (car '(1 2 3))
1
Run Code Online (Sandbox Code Playgroud)
但它并不总是像我期望的那样工作.例如,我试图创建一个函数列表,像这样,但它不起作用:
> (define math-fns '(+ - * /))
> (map (lambda (fn) (fn 1)) math-fns)
application: not a procedure;
expected a procedure that can be applied to arguments
given: '+
Run Code Online (Sandbox Code Playgroud)
当我使用时list
,它的工作原理:
> (define math-fns (list + - * /))
> (map (lambda (fn) (fn 1)) math-fns)
'(1 -1 1 1)
Run Code Online (Sandbox Code Playgroud)
为什么?我认为'
这只是一个方便的速记,为什么行为不同?
我正在通过SICP工作.目前,在第一章中,我遇到了让Racket重新定义"原语"的问题.例如,我的印象是我应该可以任意做(define + 5)
,这样就可以了,或重新定义sqrt
程序.相反,我明白了:
define-values: cannot change constant variable: +
Run Code Online (Sandbox Code Playgroud)
我的语言目前设置为R5RS,我认为这样可以解决与SICP的兼容性问题.