Code Monkey home page Code Monkey logo

learn_clojure.mp4's Introduction

Learn Clojure: The Easy Way

陆陆续续用了4个月把这套视频终于录制完成了,算是在 2017 年底完成了自己一个小心愿,让国内学习 Clojure 有更多的选择。

这套视频共 7 讲,不需要什么基础,能跟着视频里讲解实际动手操作就行。如果你想尝试一下古老的 Lisp,这套视频应该不会让你失望。

PS:这套视频收费¥30,大家可以先选择预览后决定是否购买。 PPS:为什么不 free ?答:轻易获得的东西一般都不太珍惜,收费一方面是为了严格要求我自己保证质量,另一方面是让听众有所重视,不至于放在硬盘某个地方吃灰。

如果你有 Clojure 基础,只对某些知识点比较模糊,也可以选择下面的视频进行针对性学习。

  1. Clojure 初相识,售价:¥4.04
  2. Clojure 数据类型以及 REPL 测试技巧,售价:¥4.04
  3. 再谈 lazy 与 persistent,售价:¥10.24
  4. 多态、自定义数据类型与 Java 互操作,售价:¥5.00
  5. 深入浅出Transducer,售价:¥5.00
  6. Clojure并发编程,售价:¥5.00
  7. 深入浅出宏编程,售价:¥10.24

Why Lisp

我是 2013 年从 SICP 开始接触 Lisp,下面这个视频是我阅读 SICP 的一些收获,感兴趣的可以看看。

联系

learn_clojure.mp4's People

Contributors

jiacai2050 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

learn_clojure.mp4's Issues

推荐一个库 https://github.com/marick/Midje

我们公司从2013年开始从j2ee全面转向 clojure . midje 给了很大的帮助.
尤其是开发的时候 (autotest :filter :xxx) 这个功能,基本上现在所有语言的单元测试中称第一.当之无愧.

concurrency 演示代码

(ns ^{:author "Jiacai Liu"
      :doc "https://segmentfault.com/l/1500000012456162"}
    demo.concurrency
  (:import java.util.concurrent.Executors))

(def nthread (+ 2 (.. Runtime getRuntime availableProcessors)))
(def executor (Executors/newFixedThreadPool nthread))

(defn do-job [workers]
  (doseq [f (.invokeAll executor workers)]
    (.get f)))

;; dynamic varbinding
(def ^:dynamic dynamic-var 123)
(do
  (println dynamic-var)
  (println (.. Thread currentThread getName))
  (future
    (binding [dynamic-var 321]
      (println (.. Thread currentThread getName))
      (println dynamic-var)))
  (println dynamic-var))

;; 很少用到,类似其他语言里面的变量
(with-local-vars [local-var 111]
  (println "test local var")
  (println (var-get local-var))
  (var-set local-var 222)
  (println (var-get local-var)))

;; Atom
(let [niters 10000
      magic-num (atom 1000)
      workers (map (fn [t]
                     (fn []
                       (dotimes [_ niters]
                         (swap! magic-num inc))))
                   (range nthread))]
  (do-job workers)
  (println "magic-num = " @magic-num))

;; Agent
(let [niters 10
      magic-num (agent 1000)
      worker (fn [n]
               (Thread/sleep 1)
               (inc n))]
  (set-agent-send-executor! executor)
  (dotimes [_ (* nthread niters)]
    (send magic-num worker)
    ;; IO operation
    (send-off magic-num worker)
    )

  (println "magic-num = " @magic-num)
  (await magic-num)
  (println "magic-num = " @magic-num))

;; Ref
(time (let [niters 10000
            run-times (atom 0)
            tom   (ref 100000)
            jerry (ref 100000)
            transfer (fn [amount]
                       (dosync
                        (swap! run-times inc)
                        (commute tom + amount)
                        ;; (alter tom + amount)
                        (alter jerry - amount)
                        ))
            workers (map (fn [t]
                           (fn []
                             (dotimes [_ niters]
                               (transfer t))))
                         (range nthread))]
        (doseq [f (.invokeAll executor workers)]
          (.get f))
        (println (format "tom = %s, jerry = %s, sum = %s, run-times = %s"
                         @tom @jerry (+ @tom @jerry) @run-times))))

宏 课程示例代码

(ns ^{:author "Jiacai Liu"
      :doc "https://segmentfault.com/l/1500000012556115"}
    demo.macro)

;; quote syntax-quote unquote splicing-unquote
;; 控制 symbol/list 求值时的行为
(let [x '(* 2 3) y x]
  (println `y)
  (println ``y)
  (println ``~y)
  (println ``~~y)
  (println (eval ``~~y))
  (println `(~@y))
  (println `(~y)))

(defmacro nothing [params]
  (println params (type params)))

(nothing x)

;; 一个简单的宏使用示例
(macroexpand-1 '(when (even? (rand-int 100))
                  (println "good luck!")
                  (println "lisp rocks!")))

;; 辅助函数
(defn prime? [n]
  (let [guard (int (Math/ceil (Math/sqrt n)))]
    (loop [i 2]
      (if (zero? (mod n i))
        false
        (if (= i guard)
          true
          (recur (inc i)))))))

(defn next-prime [n]
  (if (prime? n)
    n
    (recur (inc n))))

;; do-primes 基本形式
(defmacro do-primes [[variable start end] & body]
  `(loop [~variable ~start]
     (when (< ~variable ~end)
       (when (prime? ~variable)
         ~@body)
       (recur (next-prime (inc ~variable))))))

;; (doseq [a (range 10)]
;;   (println a))
(do-primes [n 2 (rand-int 10)] ;; [2, 13)
           (println n))

(def start 1)
;; 使用 gensym 保证宏卫生
(defmacro do-primes2 [[variable start end] & body]
  `(let [start# ~start
         end# ~end]
     (loop [~variable start#]
       (when (< ~variable end#)
         (when (prime? ~variable)
           ~@body)
         (recur (next-prime (inc ~variable)))))))

(do-primes2 [n 2 (rand-int 10)] ;; [2, 13)
            (println n))

(defmacro do-primes2-danger [[variable start end] & body]
  `(let [inner-start ~start
         inner-end ~end]
     (loop [~variable inner-start]
       (when (< ~variable inner-end)
         (when (prime? ~variable)
           ~@body)
         (recur (next-prime (inc ~variable)))))))

(macroexpand-1 '(do-primes2 [n 2 (+ 10 (rand-int 30))]
                                  (println n)))
(do-primes2-danger [n 2 (+ 10 (rand-int 30))]
                   (println n))
;; ~(quote inner-start)
(defmacro do-primes2-safe [[variable start end] & body]
  `(let [~'inner-start ~start
         ~'inner-end ~end]
     (loop [~variable ~'inner-start]
       (when (< ~variable ~'inner-end)
         (when (prime? ~variable)
           ~@body)
         (recur (next-prime (inc ~variable)))))))

(do-primes2-safe [n 2 (+ 10 (rand-int 30))]
                 (println n))


;; 宏嵌套宏
(defmacro only-once [names & body]
  (let [gensyms (repeatedly (count names) gensym)]
    (println "mmm")
    `(let [~@(interleave gensyms (repeat '(gensym)))]
       (println "nnn")
       `(let [~~@(mapcat #(list %1 %2) gensyms names)]
          (println "xxx")
          ~(let [~@(mapcat #(list %1 %2) names gensyms)]
             (println "yyy")
             ~@body)))))

(defmacro do-primes3 [[variable start end] & body]
  (only-once [start end]
             `(loop [~variable ~start]
                (when (< ~variable ~end)
                  (when (prime? ~variable)
                    ~@body)
                  (recur (next-prime (inc ~variable)))))))

(do-primes3 [n 2 (+ 10 (rand-int 30))]
           (println n))

;; 使用辅助函数来定义宏
(defmacro def-watched [name & value]
  `(do
     (def ~name ~@value)
     (add-watch (var ~name)
                :re-bind
                (fn [~'key ~'r old# new#]
                  (println '~name old# " -> " new#)))))
(def-watched foo 1)                  
(def foo 2)


(defmacro gen-watch-fn [name]
  (fn [k r o n]
    (println name ":" o " -> " n)))

(defmacro def-watched2 [name & value]
  `(do
     (def ~name ~@value)
     (add-watch (var ~name)
                :re-bind (gen-watch-fn '~name))))

(def-watched2 bar 1)                  
(def-watched2 bar 2)                  

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.