SlideShare una empresa de Scribd logo
1 de 16
Clojureについて
本を読んだだけで
 語ってみるよ
     2010/10/17
 NTTソフトウェア株式会社
      上原潤二
Clojureとは

• JVM上で動くLisp方言
• 関数型言語
• プログラミングClojure →
 • Gaucheの川合史郎さん訳
短く書ける


Clojure                                                          Scala




 http://www.bestinclass.dk/index.php/2009/09/scala-vs-clojure-round-2-concurrency/
関数型言語の3階層
•   レベル1
    •   関数定義でプログラムを書く
        •   Emacs Lisp, Common Lisp, Scheme, C言語
•   レベル2
    •   レベル1に加え、 副作用を排し、遅延評価を駆使する
        •   Scala, Haskell
•   レベル3
    •   レベル2に加え、オブジェクト指向を否定し型に頼らない
        •   Clojure ←いまここ

                 注:この階層は本資料作成者が勝手に考えたもの。
副作用を避けるといっても

•   徹底的に避ける派: Haskell
    •   Monad
•   できるだけ避ける派: Scala, Clojure
    •   どうせJavaアクセスに必要だし
    •   ただし、副作用が生じるものとそうでないも
        のを明確に区分けして扱う
他の言語との比較
                                                      ダックタイピン
          動的型/静的型           クラスベース 動的言語か※
                                                         グ

          動的型+型ヒント
Clojure    による最適化               ×            ×             ○

          静的型+型
Scala                           ○            ×             ×
           推論
 Java        静的型                ○            ×             ×
          動的型+オプショナル
Groovy    タイピングによる実行
             時チェック
                                ○            ○             ○

Ruby         動的型                ○            ○             ○
    ※参考: http://groovy.dzone.com/news/dynamic-typing-vs-dynamic-lang
Java連携                      面白
                                         い!



• JavaのAPIを呼び出すための専用構文
 (.toUpperCase "String") ;; インスタンスメソッド呼出
 (.. "String " toUpperCase trim) ;; a.b.c
 (Math/max 1 2)        ;; staticメソッド呼出
 (Integer. 3)          ;; new Integer
• Javaよりも短く、Java APIを呼ぶ
多様な並行処理モデル
•   ref & STM ・・・トランザクショナルな(ロールバ
    ック可能な)アトミック操作(ACIDならぬACI)
•   Atom・・・ アトミックな参照変数だがロールバッ
    クはしない
•   Agents・・・キューを使ってタスクを非同期実行
    (結果的にアトミックになる)。synchronizedの
    waitしないバージョン。GParsのSafeに影響。
•   スレッドローカルなvar
•   lock ・・・Javaのsynchronized
ref & STM                     面白
                                           い!
•   (def current-track (ref "北の宿から"))
    (def current-singer (ref "都はるみ"))
    (dosync
     (ref-set current-track "天城越え")      トランザクション
     (ref-set current-singer "石川はるみ"))
•   SMT(ソフトウェアトランザクショナルメモリ)
•トランザクションは楽観的排他制御によってロールバックされた
り再実行されたりするからして、副作用は許されない。→関数型
の効用
•楽観的排他制御は「ロックフリーアルゴリズム」でありロック待ち
しないので原理的に高速。やってみて駄目ならもう一度やる。マ
ルチコア・メニーコア時代の新常識 。
遅延評価
• 遅延シーケンス
    >(def long-seq (range 0 100000000))
    >(take 3 long-seq)
    (0 1 2)
•   無限長シーケンスでも無問題
    >(defn mugen-seq [] (iterate inc 0))
    > (take 3 (mugen-seq))
    (1 2 3)
マルチメソッド
• 引数の型(でも何でも)に応じて関数ディス
 パッチ。
•つまりメソッドオーバーロード定義のようなも
のだが、メソッド選択は動的であり、ディスパッ
チルールをカスタム定義可
• CLOSにもある。CLOSはこれをオブジェク
 ト指向と呼ぶ。
マクロ                          面白
                                                    い!
•   リーダマクロ
    •   #(), ;, @, ^, #^, ', #"", 'x, ~, ~@, #'
    •   ユーザ定義はできない
•   普通のマクロ
    (defmacro my-if [cond body] `(if ~cond ~body))
    (my-if true (println "hoge"))
•   マクロはGroovyでいうAST変換に相当(コンパイラ
    のコンパイル処理に介在して、コード変換を行う)
    •   コーディングパターン/デザインパターンを表現
        する間接レイヤ
recur,trampoline
 •   自動的な末尾再帰最適化はしない(JVM制約による)
 • 明示的な末尾再帰最適化を指示するためのマーカ:
•
recur
•trampoline(相互再帰用)
 •   (defn recur-fibo [n]
      (letfn [(fib [current next n]
                (if (zero? n)
                   current
                   (recur next (+ current next) (dec n))))]
      (fib 0 1 n))
変態?なところ                            面白
                                                  い!

•   [ ] はvectorリテラル、マップリテラル{}, セットリテラル#{}も書ける
    > (defn plus [a b] (+ a b))
•   (vector インデックス) で要素参照
    >([1, 2, 3] 1)
    2
•   (マップ キー)でキーに対応する値が取れる
    >({ :hoge 10 :fuga 20 } :hoge)
    10
•   カンマと空白は等価
    { :hoge 10, :fuga 20 }
    (+ 1,2)
•   分配束縛・・・引数を受け取りつつパターンマッチングしつつ多重変数代
    入
    •   何を言ってるかわからねーと思うが引数を取得したら処理の大半が
        終わっていた・・
オブジェクト指向への
          アンチテーゼ
•   オブジェクト指向は冗長である
    •   可読性重視とかいったって、コード量が莫大になる
        ならそれはやっぱり理解しにくく読みにくい。難解で
        も短い方がいい(難解な部分を極小化した上で)。
•   名詞が幅を利かせすぎている
    •   動詞の逆襲
•   オブジェクト指向の利点(カプセル化、情報隠蔽、再利
    用、多態)は、関数型とクロージャとマルチメソッドでよ
    りよく達成できる
まとめ
• Lispは死なぬ、何度でも甦るさ。
• Scalaの対抗馬?
• STMは実に重要だと思う。ロックフリーア
  ルゴリズムはマルチコア時代のキーワード。
•JavaではMultiverseというアノテーションベー
スのSTMあり

Más contenido relacionado

La actualidad más candente

D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
9rnsr
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
Satoshi Sato
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
Kenji Yoshida
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
Net Penguin
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
Genya Murakami
 

La actualidad más candente (20)

D言語会議#1
D言語会議#1D言語会議#1
D言語会議#1
 
リテラル文字列型までの道
リテラル文字列型までの道リテラル文字列型までの道
リテラル文字列型までの道
 
JSX / Haxe / TypeScript
JSX / Haxe / TypeScriptJSX / Haxe / TypeScript
JSX / Haxe / TypeScript
 
わかる LT@2
わかる LT@2わかる LT@2
わかる LT@2
 
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
Rubyの御先祖CLUのお話(OSC 2011 Shimane LT 資料)
 
Ruby でつくる型付き Ruby
Ruby でつくる型付き RubyRuby でつくる型付き Ruby
Ruby でつくる型付き Ruby
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析型プロファイラ:抽象解釈に基づくRuby 3の静的解析
型プロファイラ:抽象解釈に基づくRuby 3の静的解析
 
ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
Hacking Ruby with Python
Hacking Ruby with PythonHacking Ruby with Python
Hacking Ruby with Python
 
rpscala35-scala2.9.0
rpscala35-scala2.9.0rpscala35-scala2.9.0
rpscala35-scala2.9.0
 
197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング197x 20090704 Scalaで並行プログラミング
197x 20090704 Scalaで並行プログラミング
 
Monad tutorial
Monad tutorialMonad tutorial
Monad tutorial
 
JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会
 
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだconstexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
constexpr関数はコンパイル時処理。これはいい。実行時が霞んで見える。cpuの嬌声が聞こえてきそうだ
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語TypeScript & 関数型講座 第2回 TypeScript という言語
TypeScript & 関数型講座 第2回 TypeScript という言語
 
Ruby 3のキーワード引数について考える
Ruby 3のキーワード引数について考えるRuby 3のキーワード引数について考える
Ruby 3のキーワード引数について考える
 
第1回勉強会スライド
第1回勉強会スライド第1回勉強会スライド
第1回勉強会スライド
 
Better C#の脱却を目指して
Better C#の脱却を目指してBetter C#の脱却を目指して
Better C#の脱却を目指して
 

Similar a Clojure

Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
Taku Miyakawa
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
AdvancedTechNight
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
Ra Zon
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
Shuyo Nakatani
 
Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語
Taku Miyakawa
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
Kengo Toda
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
 

Similar a Clojure (20)

JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
ATN No.2 Scala事始め
ATN No.2 Scala事始めATN No.2 Scala事始め
ATN No.2 Scala事始め
 
Kink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based languageKink: invokedynamic on a prototype-based language
Kink: invokedynamic on a prototype-based language
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
 
ななめ45°から見たJavaOne
ななめ45°から見たJavaOneななめ45°から見たJavaOne
ななめ45°から見たJavaOne
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
キメるClojure
キメるClojureキメるClojure
キメるClojure
 
JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介JavaScriptユーティリティライブラリの紹介
JavaScriptユーティリティライブラリの紹介
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
詳解! Decimal
詳解! Decimal詳解! Decimal
詳解! Decimal
 
Web本文抽出 using crf
Web本文抽出 using crfWeb本文抽出 using crf
Web本文抽出 using crf
 
20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)20130228 Goノススメ(BPStudy #66)
20130228 Goノススメ(BPStudy #66)
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 
Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語Kink: プロトタイプベースの俺々 JVM 言語
Kink: プロトタイプベースの俺々 JVM 言語
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
 
xv6から始めるSPIN入門
xv6から始めるSPIN入門xv6から始めるSPIN入門
xv6から始めるSPIN入門
 

Más de Uehara Junji

Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309
Uehara Junji
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Uehara Junji
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224
Uehara Junji
 

Más de Uehara Junji (20)

Use JWT access-token on Grails REST API
Use JWT access-token on Grails REST APIUse JWT access-token on Grails REST API
Use JWT access-token on Grails REST API
 
Groovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUGGroovy Bootcamp 2015 by JGGUG
Groovy Bootcamp 2015 by JGGUG
 
Groovy Shell Scripting 2015
Groovy Shell Scripting 2015Groovy Shell Scripting 2015
Groovy Shell Scripting 2015
 
Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418Shibuya JVM Groovy 20150418
Shibuya JVM Groovy 20150418
 
Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3Markup Template Engine introduced Groovy 2.3
Markup Template Engine introduced Groovy 2.3
 
Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait Introduce Groovy 2.3 trait
Introduce Groovy 2.3 trait
 
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ckIndy(Invokedynamic) and Bytecode DSL and Brainf*ck
Indy(Invokedynamic) and Bytecode DSL and Brainf*ck
 
enterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summerenterprise grails challenge, 2013 Summer
enterprise grails challenge, 2013 Summer
 
New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1New features of Groovy 2.0 and 2.1
New features of Groovy 2.0 and 2.1
 
Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309Groovy kisobenkyoukai20130309
Groovy kisobenkyoukai20130309
 
Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)Read Groovy Compile process(Groovy Benkyoukai 2013)
Read Groovy Compile process(Groovy Benkyoukai 2013)
 
groovy 2.1.0 20130118
groovy 2.1.0 20130118groovy 2.1.0 20130118
groovy 2.1.0 20130118
 
New feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*WorkshopNew feature of Groovy2.0 G*Workshop
New feature of Groovy2.0 G*Workshop
 
G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901G* Workshop in fukuoka 20120901
G* Workshop in fukuoka 20120901
 
JJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/GrailsJJUG CCC 2012 Real World Groovy/Grails
JJUG CCC 2012 Real World Groovy/Grails
 
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)Java One 2012 Tokyo JVM Lang. BOF(Groovy)
Java One 2012 Tokyo JVM Lang. BOF(Groovy)
 
Java x Groovy: improve your java development life
Java x Groovy: improve your java development lifeJava x Groovy: improve your java development life
Java x Groovy: improve your java development life
 
Groovy 1.8の新機能について
Groovy 1.8の新機能についてGroovy 1.8の新機能について
Groovy 1.8の新機能について
 
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
Let's go Developer 2011 sendai Let's go Java Developer (Programming Language ...
 
Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224Jggug ws 15th LT 20110224
Jggug ws 15th LT 20110224
 

Clojure

  • 1. Clojureについて 本を読んだだけで 語ってみるよ 2010/10/17 NTTソフトウェア株式会社 上原潤二
  • 2. Clojureとは • JVM上で動くLisp方言 • 関数型言語 • プログラミングClojure → • Gaucheの川合史郎さん訳
  • 3. 短く書ける Clojure Scala http://www.bestinclass.dk/index.php/2009/09/scala-vs-clojure-round-2-concurrency/
  • 4. 関数型言語の3階層 • レベル1 • 関数定義でプログラムを書く • Emacs Lisp, Common Lisp, Scheme, C言語 • レベル2 • レベル1に加え、 副作用を排し、遅延評価を駆使する • Scala, Haskell • レベル3 • レベル2に加え、オブジェクト指向を否定し型に頼らない • Clojure ←いまここ 注:この階層は本資料作成者が勝手に考えたもの。
  • 5. 副作用を避けるといっても • 徹底的に避ける派: Haskell • Monad • できるだけ避ける派: Scala, Clojure • どうせJavaアクセスに必要だし • ただし、副作用が生じるものとそうでないも のを明確に区分けして扱う
  • 6. 他の言語との比較 ダックタイピン 動的型/静的型 クラスベース 動的言語か※ グ 動的型+型ヒント Clojure による最適化 × × ○ 静的型+型 Scala ○ × × 推論 Java 静的型 ○ × × 動的型+オプショナル Groovy タイピングによる実行 時チェック ○ ○ ○ Ruby 動的型 ○ ○ ○ ※参考: http://groovy.dzone.com/news/dynamic-typing-vs-dynamic-lang
  • 7. Java連携 面白 い! • JavaのAPIを呼び出すための専用構文 (.toUpperCase "String") ;; インスタンスメソッド呼出 (.. "String " toUpperCase trim) ;; a.b.c (Math/max 1 2) ;; staticメソッド呼出 (Integer. 3) ;; new Integer • Javaよりも短く、Java APIを呼ぶ
  • 8. 多様な並行処理モデル • ref & STM ・・・トランザクショナルな(ロールバ ック可能な)アトミック操作(ACIDならぬACI) • Atom・・・ アトミックな参照変数だがロールバッ クはしない • Agents・・・キューを使ってタスクを非同期実行 (結果的にアトミックになる)。synchronizedの waitしないバージョン。GParsのSafeに影響。 • スレッドローカルなvar • lock ・・・Javaのsynchronized
  • 9. ref & STM 面白 い! • (def current-track (ref "北の宿から")) (def current-singer (ref "都はるみ")) (dosync (ref-set current-track "天城越え") トランザクション (ref-set current-singer "石川はるみ")) • SMT(ソフトウェアトランザクショナルメモリ) •トランザクションは楽観的排他制御によってロールバックされた り再実行されたりするからして、副作用は許されない。→関数型 の効用 •楽観的排他制御は「ロックフリーアルゴリズム」でありロック待ち しないので原理的に高速。やってみて駄目ならもう一度やる。マ ルチコア・メニーコア時代の新常識 。
  • 10. 遅延評価 • 遅延シーケンス >(def long-seq (range 0 100000000)) >(take 3 long-seq) (0 1 2) • 無限長シーケンスでも無問題 >(defn mugen-seq [] (iterate inc 0)) > (take 3 (mugen-seq)) (1 2 3)
  • 12. マクロ 面白 い! • リーダマクロ • #(), ;, @, ^, #^, ', #"", 'x, ~, ~@, #' • ユーザ定義はできない • 普通のマクロ (defmacro my-if [cond body] `(if ~cond ~body)) (my-if true (println "hoge")) • マクロはGroovyでいうAST変換に相当(コンパイラ のコンパイル処理に介在して、コード変換を行う) • コーディングパターン/デザインパターンを表現 する間接レイヤ
  • 13. recur,trampoline • 自動的な末尾再帰最適化はしない(JVM制約による) • 明示的な末尾再帰最適化を指示するためのマーカ: • recur •trampoline(相互再帰用) • (defn recur-fibo [n] (letfn [(fib [current next n] (if (zero? n) current (recur next (+ current next) (dec n))))] (fib 0 1 n))
  • 14. 変態?なところ 面白 い! • [ ] はvectorリテラル、マップリテラル{}, セットリテラル#{}も書ける > (defn plus [a b] (+ a b)) • (vector インデックス) で要素参照 >([1, 2, 3] 1) 2 • (マップ キー)でキーに対応する値が取れる >({ :hoge 10 :fuga 20 } :hoge) 10 • カンマと空白は等価 { :hoge 10, :fuga 20 } (+ 1,2) • 分配束縛・・・引数を受け取りつつパターンマッチングしつつ多重変数代 入 • 何を言ってるかわからねーと思うが引数を取得したら処理の大半が 終わっていた・・
  • 15. オブジェクト指向への アンチテーゼ • オブジェクト指向は冗長である • 可読性重視とかいったって、コード量が莫大になる ならそれはやっぱり理解しにくく読みにくい。難解で も短い方がいい(難解な部分を極小化した上で)。 • 名詞が幅を利かせすぎている • 動詞の逆襲 • オブジェクト指向の利点(カプセル化、情報隠蔽、再利 用、多態)は、関数型とクロージャとマルチメソッドでよ りよく達成できる
  • 16. まとめ • Lispは死なぬ、何度でも甦るさ。 • Scalaの対抗馬? • STMは実に重要だと思う。ロックフリーア ルゴリズムはマルチコア時代のキーワード。 •JavaではMultiverseというアノテーションベー スのSTMあり