我们有两个函数来计算给定数字的阶乘.第一个,!使用累加器样式.第二种,fact使用自然递归.
(define (! n0)
(local (;; accumulator is the product of all natural numbers in [n0, n)
(define (!-a n accumulator)
(cond
[(zero? n) accumulator]
[else (!-a (sub1 n) (* n accumulator))])))
(!-a n0 1)))
Run Code Online (Sandbox Code Playgroud)
和
(define (fact n)
(cond
[(= 0 n) 1]
[else (* n (fact (- n 1)))]))
Run Code Online (Sandbox Code Playgroud)
在第31节的底部,HtDP声明自然递归版本通常与累加器版本一样快,但不会说明原因.我对此做了一些阅读,似乎答案是"尾调优化/消除",但维基百科的文章似乎与HtDP的说法不一致,至少在性能方面.为什么会这样?
在工作中,递归样式更快.在家里,累加器风格更快.是否没有通用的启发式指导选择哪种风格通常是首选的?我知道累加器式的内存效率更高,但如果我们将讨论局限于性能,至少对我来说,目前还不清楚,哪个是更好的选择.
我已经考虑了这一点,并且不得不支持维基百科关于累积器式递归在一般情况下的优越性的文章.它不仅减少了堆栈/堆空间的使用,而且内存访问总是落后于寄存器访问,并且只有现在多核就在这里才能更加明显.尽管如此,HtDP证明在所有情况下都需要进行实际测试.
关于clojure中地图的第一个奇怪的事情是在以下片段中:
(apply map list '((1 a) (2 b) (3 c)))
Run Code Online (Sandbox Code Playgroud)
结果令我惊讶:
((1 2 3) (a b c))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释它的工作原理
你如何组织你的erlang工作流程?我现在正在学习一些Erlang,我在每次编辑后都使用Rebar,重新编译,重建并重新启动整个版本(我试图保持OTP').我很确定有一种更聪明的方法可以做到这一点.
我正在尝试编写一个宏来定义具有相关函数的特殊数据结构类.
我知道这是可能的; 它在核心语言本身中多次完成.
作为一个具体的例子,我如何define-struct在Scheme本身中定义宏.它需要创造make-struct,struct-<<field>>等功能.
我试过这样做define,但是,这只定义了宏的词法范围中的函数.
如何在宏中实际定义函数?
我对列表的工作方式car和cdr工作感到困惑.这是我尝试过的一个例子:
(define sample (read))
(display sample)
(display (car sample))
(display (cdr sample))
(display (car (cadr sample)))
(display (cdr (cdr sample)))
Run Code Online (Sandbox Code Playgroud)
在输入值时'(A B C D E F),我得到的是:
'(a b c d e f)
quote
((a b c d e f))
a
()
Run Code Online (Sandbox Code Playgroud)
我无法理解那怎么quote可能是car的sample.另外,为什么(cdr sample)输出((a b c d e f))?
语言:DrScheme - R5RS - Scheme
下面是我的代码,它将列表的car元素(carVal)和列表(初始化为空)作为参数.我想将元素追加到列表中,但同样不起作用.
(define populateValues
(lambda (carVal currVal)
(append currVal(list carVal ))
(display currVal)))
Run Code Online (Sandbox Code Playgroud)
显示屏始终显示空列表().谁能帮我理解为什么?
我知道可以从shell启动节点.我正在寻找的是一种从模块内启动远程节点的方法.我搜索过,但一直都找不到.
任何帮助表示赞赏.
我一直在阅读Erlang和OTP,并偶然发现了一个关于不正确列表的问题.
即使您认为自己有一个聪明的想法,也不要试图以这种方式使用列表单元格 - 它容易出错并且会混淆人类和程序分析工具.也就是说,创建不正确的列表有一两个有效用途,但它们被认为是高级编程技术,超出了本书的范围.
超出本书的范围?它必须是Stackoverflow的完美之选!
所以我的问题当然是一些有效的用途是什么?
我一直想知道为什么道格拉斯·克罗克福德不断将JavaScript与Scheme进行比较.是JS的设计者打算成为Scheme; 但除了第一类函数支持和词法范围(破碎)之外,JS与Scheme有什么共同之处,使其成为"C's服装中的Lisp"?
javascript lisp scheme programming-languages functional-programming
racket ×5
scheme ×5
list ×4
erlang ×3
lisp ×3
erlang-otp ×2
clojure ×1
javascript ×1
macros ×1
networking ×1
workflow ×1