得到这些例子我想了解但他们在Scheme中.我希望他们在Clojure:D
示例1 - 计算列表的长度
(define length
(lambda (ll)
(cond
((null? ll) 0)
(#t (add1
(length (cdr ll)))))))
Run Code Online (Sandbox Code Playgroud)
例2 - 列表的每个元素的平方
(define squares
(lambda (li)
(cond
((null? li) ())
(#t (cons
(* (char li) (char li))
(squares(cdr
li)))))))
Run Code Online (Sandbox Code Playgroud)
例3 - "map"函数(如map/reduce)
(define map (lambda (func lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
(map func (cdr lst)))))))
Run Code Online (Sandbox Code Playgroud)
咖喱"地图"
(define map2
(lambda (func)
(lambda (lst)
(cond ((null? lst) ())
(#t (cons (func (car lst))
((map2 func) (cdr lst)))))))
Run Code Online (Sandbox Code Playgroud)
动机
这些例子来自功能编程的演示文稿,其他人可能会对此感兴趣:功能语言101:关于什么是大惊小怪?
一旦您提交了答案,我希望您同意将其作为评论在该演示文稿中发布,以便Clojure人员了解原始代码
我有一些stoff:http://github.com/nickik/Essentials-of-PLs-in-Clojure/blob/master/src/EssentialsOfProgrammingLanguages/core.clj
它的所有计划都是为了解决问题.您可以下载Essentials of Programming Languages-Book的源代码以获得Scheme代码.
以下是您的示例:
(defn length [lst]
(cond
(seq ll) 0
:else (inc (length (rest lst))))))
Run Code Online (Sandbox Code Playgroud)
注意:clojure具有计数功能
(defn squares1 [li]
(cond (nil? (seq li)) (empty li)
:else (conj (squares1 (rest li)) (* (first li) (first li)))))
(defn squares2 [li]
(map #(* % %) li))
Run Code Online (Sandbox Code Playgroud)
(defn mymap [f coll]
(cond (nil? (seq coll)) (empty coll)
:else (conj (mymap f (rest coll)) (f (first coll)))))
Run Code Online (Sandbox Code Playgroud)
(defn map2 [f]
(fn [lst]
(cond (nil? (seq lst)) (empty lst)
:else (conj ((map2 f) (rest lst)) (f (first lst))))))
Run Code Online (Sandbox Code Playgroud)
请注意,您不能只进行1:1的翻译.'()evals之间的差异等等.
这是最重要的
列表长度:
(defn my-length [lst]
(loop [len 0 x lst]
(if (empty? x)
len
(recur (+ 1 len) (rest x)))))
user=> (my-length '(1))
1
user=> (my-length '(1 2 3 4))
4
user=> (my-length '())
0
Run Code Online (Sandbox Code Playgroud)
平方列表的每个元素:
(defn squares [lst]
(loop [sqrs '() x lst]
(if (empty? x)
(reverse sqrs)
(recur (cons (* (first x) (first x)) sqrs) (rest x)))))
user=> (squares '(1 2 3 4))
(1 4 9 16)
Run Code Online (Sandbox Code Playgroud)
地图:
(defn my-map [func lst]
(loop [res '() x lst]
(if (empty? x)
(reverse res)
(recur (cons (func (first x)) res) (rest x)))))
user=> (my-map (fn [x] (* x 2)) '(1 2 3))
(2 4 6)
Run Code Online (Sandbox Code Playgroud)
地图2:
请参阅nickik的解决方案.