你能从Functional Languages 101翻译这两个例子吗?(计划 - > Clojure)

Bel*_*lun 4 scheme clojure

得到这些例子我想了解但他们在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人员了解原始代码

nic*_*kik 6

我有一些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之间的差异等等.

这是最重要的

  • (nil?(seq list))not(null?lst)因为'()在clojure中不是nil
  • 结合更好然后你可以使功能与mure数据结构一起工作
  • (空lst)比'()好,因为(空lst)保持类型向量,列表,记录,结构或其他东西


Vij*_*hew 5

列表长度:

(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的解决方案.