在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。 当然,如果我们定义辅助function翻转,像这样: (define (flip bin-fn) (lambda (xy) (bin-fn yx))) 那么我们可以在Racket中实现与Haskell相同的行为:而不是(foldl – 0 '(1 2 3 4))我们可以写成: […]
我一直和The Little Schemer一起学习Scheme,并使用PLT-Scheme来处理我的环境。 小Schemer帮助我很大程度上recursion(现在对我来说很简单),但是我被卡在介绍“collections家”的书的一部分,并且把整个函数作为一个整体继续。 这里是他们使用的示例代码。 我理解recursion元素,但我卡住了,特别是在lambda函数 – 我的头脑不能遵循path,如何设置该lambda函数的参数(因为他们唯一的调用是再次调用它们recursion,有在function体内没有具体的使用)。 如果有人能够或多或less地通过将函数recursion到lambda收集器中来计算我的计算path,那可能对我有帮助。 ;; 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)) […]
我对macros很感兴趣,刚开始明白它的真正的力量。 请帮助我收集macros观系统的一些很好的用法。 到目前为止,我有这些构造: 模式匹配: 安德鲁·怀特和布鲁斯·金巴。 计划的模式匹配,1995 序言精神中的关系: 多丽Sitaram。 在schelog中编程。 http://www.ccs.neu.edu/home/dorai/schelog/schelog.html Daniel P. Friedman,William E. Byrd和Oleg Kiselyov。 理性的策略。 MIT出版社,2005年7月 Matthias Felleisen。 将Prolog转换成Scheme。 1985年印第安纳大学技术报告。 可扩展的循环结构: 塞巴斯蒂安Egner。 在计划中的渴望理解:SRFI-42的devise。 计划和function编程研讨会,第13-26页,2005年9月。 奥林寒颤。 循环的解剖:范围和控制的故事。 在function规划国际会议上,第2-14页,2005。 class级系统: PLT。 PLT MzLib:库手册。 技术报告PLT-TR2006-4-v352,PLT Scheme Inc.,2006。http://www.plt-scheme.org/techreports/ Eli Barzilay。 骗取。 http://www.barzilay.org/Swindle 。 组件系统: 瑞安Culpepper,斯科特欧文斯和马修弗拉特。 组件接口中的语法抽象。 生成规划和组件工程国际会议,第373-388页,2005年 软件合同检查 马修·弗拉特(Matthew Flatt)和马提亚·费利森 单位:用于HOT语言的酷模块在ACM SIGPLAN会议上的编程语言devise和实现,第236-248页,1998 Oscar Waddell和R. Kent Dybvig。 扩展了句法抽象的范围。在编程语言原理研讨会上,第203-215页,第199页 […]
我知道他们是同一种叫lisp的语言家族的方言,但究竟有什么不同呢? 如果可能的话,你能否给出一个概述,包括语法,特性,特性和资源等主题。
球拍是Scheme的后裔。 Racket与R6RS有什么不同? 它增加了什么,或带走了什么,或者只是不同? 我知道Racket不仅仅是一种语言,它是一个语言平台。 但我指的是主要的球拍方言。
我刚刚开始觉得我对于在球拍和scheme中使用lambda有一个模糊的理解,当我在SICP中遇到以下“替代”缺陷和汽车的定义 (define (cons xy) (lambda (m) (mxy))) (define (car z) (z (lambda (pq) p))) (define (cdr z) (z (lambda (pq) q))) 对于我的生活,我只是不能parsing它们。 任何人都可以解释如何parsing或扩展这些对于新手来说是有意义的吗?
我有一个简单的球拍定义,用于将二进制数字相乘。 它使用一个经过充分testing的“addWithCarry”定义,它有三个参数:两个列表和一个进位数字,并返回二进制和。 二进制数字以相反的顺序表示为列表。 我用debugging器遍历testing线,并正确执行recursion。 它会在每次缩小y列表时执行multBins,然后按照预期执行addWithCarry函数。 当它重新堆栈时,它突然抛出一个exception“应用程序:不是一个过程,期望可以应用于参数的过程”,参数“(0 0 0 1 0 1 1)”是最高的值“x”加在总数上。 我知道这个错误可能会发生,当你试图将一个函数的结果作为一个函数与一个参数,但我没有看到这里。 看着debugging器,一切似乎都完美地工作,直到最后。 有任何想法吗? (define (multBins xy) (cond ((null? y) '() ) ((= (first y) 0) ((multBins (cons 0 x) (rest y)))) (#t ((addWithCarry x (multBins (cons 0 x) (rest y)) 0))))) (test (multBins '(1 0 1 1)'(1 1 0 1))'(1 1 1 1 […]
我知道你可以使用' (aka quote ) '来创build一个列表,并且我一直使用它,就像这样: > (car '(1 2 3)) 1 但它并不总是像我所期望的那样工作。 例如,我尝试创build一个像这样的函数列表,但它不起作用: > (define math-fns '(+ – * /)) > (map (lambda (fn) (fn 1)) math-fns) application: not a procedure; expected a procedure that can be applied to arguments given: '+ 当我使用list ,它的工作原理: > (define math-fns (list + – * /)) > (map (lambda […]