你能翻译函数式语言 101 中的这 2 个例子吗? (方案 -> Clojure)
得到了这些例子,我想理解,但它们在方案中。我希望它们在 Clojure 中:D
示例 1 - 计算列表的长度
(define length
(lambda (ll)
(cond
((null? ll) 0)
(#t (add1
(length (cdr ll)))))))
示例 2 - 对列表中的每个元素进行平方
(define squares
(lambda (li)
(cond
((null? li) ())
(#t (cons
(* (char li) (char li))
(squares(cdr
li)))))))
示例 3 - “map”函数(如map/reduce)
(define map (lambda (func lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
(map func (cdr lst)))))))
柯里化“map”
(define map2
(lambda (func)
(lambda (lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
((map2 func) (cdr lst)))))))
动机
这些示例来自有关函数式编程的演示文稿,其他人可能对此感兴趣:函数式语言 101:什么有什么大惊小怪的吗?
一旦您提交了答案,我希望您同意将其作为评论发布在演示文稿中,以便 Clojure 人员理解原始代码
Got these examples I would like to understand but they are in Scheme. I would like them in Clojure :D
Example 1 - counting the length of a list
(define length
(lambda (ll)
(cond
((null? ll) 0)
(#t (add1
(length (cdr ll)))))))
Exemple 2 - square each element of a list
(define squares
(lambda (li)
(cond
((null? li) ())
(#t (cons
(* (char li) (char li))
(squares(cdr
li)))))))
Example 3 - the "map" function (as in map/reduce)
(define map (lambda (func lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
(map func (cdr lst)))))))
Curried "map"
(define map2
(lambda (func)
(lambda (lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
((map2 func) (cdr lst)))))))
Motivation
The examples are from a presentation on Functional Programming someone else might be interested it: Functional Languages 101: What’s All the Fuss About?
Once you submit an answer, I'd like your agreement to post it as a comment at that presentation for Clojure people to understand the original code
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
我这里有一些东西: http ://github.com/nickik/Essentials-of-PLs-in-Clojure/blob/master/src/EssentialsOfProgrammingLanguages/core.clj
这是 clojure 内容的所有方案。您可以下载Essentials ofProgramming Languages-Book的源码来获取Scheme代码。
以下是您的示例:
注意:clojure 有一个计数函数
请注意,您不能仅进行 1:1 翻译。 '() 评估方式等之间的差异。
这里是最重要的
I have some stoff here: http://github.com/nickik/Essentials-of-PLs-in-Clojure/blob/master/src/EssentialsOfProgrammingLanguages/core.clj
Its all scheme to clojure stuff. You can download the source of the Essentials of Programming Languages-Book to have the Scheme code.
Here are your examples:
Note: clojure has a count function
Note you can not just make a 1:1 translation. The diffrence between how '() evals and so on.
Here are the most importend ones
列表的长度:
对列表中的每个元素进行平方:
Map:
Map2:
参见 nickik 的解决方案。
Length of a list:
Square each element of a list:
Map:
Map2:
See nickik's solution.
还有
map
的更多 clojurey 翻译:利用闭包:像上面的
map
一样定义map-inner
。在惯用的 clojure 中,通常你会利用 nil 是逻辑错误。
与
map
一样:您可以使用惰性序列而不是急切列表。And more clojurey translation of
map
:Exploit closures: define
map-inner
likemap
above.In idiomatic clojure normally you exploit that the nil is logical false.
As with
map
: you would use lazy sequences instead of eager lists.define
在 clojure 中是def
,lambda
是fn
,函数参数写成向量[]< /code>,不列出
()
,null?
为empty
,car
为first,
cdr
是rest
,cond
的默认情况是用:else
指定的,而不是#t
。因此,对于您的第一个示例,我们得到:
使用
defn
而不是def
和fn
可以更简洁地编写,但情况也是如此对于scheme版本,所以我选择了最接近原来的方式。其他例子也可以用同样的方法翻译。
define
isdef
in clojure,lambda
isfn
, function arguments are written as vectors[]
, not lists()
,null?
isempty
,car
isfirst
,cdr
isrest
and the default case forcond
is specified with:else
, not#t
.So for your first example we get:
This can be written a little more succinctly using
defn
instead ofdef
andfn
, but the same is true for the scheme version, so I chose the way that is the closest to the original.The other examples can be translated the same way.