iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 2
0
Big Data

資料科學:使用 Clojure系列 第 2

Day 02 - Clojure 基礎知識(二)

繼續閱讀《Clojure for the Brave and True》

  1. 第五章
    1. 函數式編程的優勢:無副作用、引用透明
    2. 不可變數據結構(immutable data structure)
    3. 函數操作函數
      1. comp(composition):組合多個函數為一新函數;又成為
      2. memoize:可以記住呼叫過的函數參數、結果的配對
  2. Peg thing:是一個遊戲,通過設計遊戲來整理三、四、五三章的內容
  3. 第六章
    1. 命名空間(namespace)的基本概念及 REPL 下的切換
      1. 了解 def 是如何將物件存於當前命名空間下
      2. 使用 (ns-interns *ns*) 來查看物件的所處空間
      3. 函數 (create-ns *ns*)(ns-name *ns*) 及整合指令 (in-ns *ns*)
    2. refer:將別的命名空間的全部物件引入到當前命名空間
      1. ns-a 中使用 (clojure.cire/refer 'ns-b) 可以引入並能直接呼叫 ns-b 中的物件
      2. 額外的限定參數 :onlyexcluderename,可以只引入想要或把不想引入的排除
      3. ``(clojure.core/refer 'ns-b :exclude ['func-a] :rename {'func-b 'func-b-new})
      4. 在 REPL 中,系統會自動將 clojure.core 自動 refer 到當前使用者空間 *user*,然而在一般的使用者程式中不會,所以若要使用 refer,也必須在前面加上 refer 所處的命名空間 clojure.core
    3. alias 可以重命名 namespace
    4. 真實專案管理,使用 ns 這個 macro

Immutable Data Structures

var wrestlers = getAlligatorWrestlers();
var totalBites = 0;
var l = wrestlers.length;

for(var i = 0; i < l; i++){
    totalBites += wrestlers[i].timesBitten;
}

在以上的 Javascript 中,迴圈應用到了外部變數如 totalBites。在這個迴圈執行後,totalBites 也被修改了,用者無法存取原本的值(除非存在另一個變數中)。在 Clojure 中,無法修改任何東西。資料總是以類似「流」的方式在函數間傳遞。類似變數的方案是通過下述模式進行:處理後的新資料,被指定對應到舊的名稱(reference)。

comp

comp 可以把兩個函數合成一個(術語:composition)

(defn example [c] (func-a (func-b c)))
(def example (comp func-a func-b))

memoize

memoize 可以記住遞迴過程中的「參數-結果」,節省遞迴所需要的時間。

(defn fib [n]
  (condp = n
    0 0
    1 1
    (+ (fib (dec n)) (fib (- n 2)))))

(def m-fib
  (memoize (fn [n]
             (condp = n
               0 1
               1 1
               (+ (m-fib (dec n)) (m-fib (- n 2)))))))

(time (fib 30))   ;; "Elapsed time: 269.306696 msecs"
(time (m-fib 30)) ;; "Elapsed time: 5.656127 msecs"

真實專案管理

一個最簡的常見資料夾結構如下述:

| project.clj
| src 
  └ the_divine_cheese_code 
    ├ core.clj
    └ visualization
      └ svg.clj

core.clj 中,為了生出 Java class,可能要寫:

(ns the-divine-cheese-code.core
  (:require [thedivine-cheese-code.visualization.svg :as svg])
  (:gen-class))

require 的目的是讓命名空間可用。refer 的目的是去除前綴而 alias 是保留前綴但改名。use 則等同於 require + alias


上一篇
Day 01 - Clojure 基礎知識(一)
下一篇
Day 03 - Clojure 基礎知識(三)
系列文
資料科學:使用 Clojure30

尚未有邦友留言

立即登入留言