SlideShare uma empresa Scribd logo
1 de 38
Baixar para ler offline
) の品格
@emasaka
どう見ても
出オチです
本当にありがとうございました
自己紹介
● @emasaka
● 本名:高橋正和
● 駄洒落を検索結果にしてTwitterに流すメソッドの(たぶん)元祖
● ja.wikipedia.orgで「Locator/Identifier Separation Protocol」の
ページを立てた人
● 代表作:Bash on Rails
● 40代 フリーター
● ブログ
「本を読む」http://emasaka.blog65.fc2.com/
本題
「Lispはカッコが多い」
などと申しまして
(defun fact (n)
  (if (zerop n)
      1
    (* n (fact (­ n 1))) ))
階乗(factorial)をこんなふうに
書いたりします
これを
より厳密に書くと
(defun . (fact . ((n . 
nil) . ((if . ((zerop . (n 
. nil)) . (1 . ((* . (n . 
((fact . ((­ . (n . (1 . 
nil))) . nil)) . nil))) . 
nil)))) . nil))))
点対表記(Dotted pair notation)
たしかにカッコが多い!
(拍手!)
命令型プログラマーならfor文か
類似のループで問題を解く
(defun fact (n)
  (let ((i 1) (r 1))
    (while (<= i n)
      (setq r (* r i)
            i (+ i 1)) )
    r ))
ループで書くと
(defun . (fact . ((n . nil) . 
((let . (((i . (1 . nil)) . 
((r . (1 . nil)) . nil)) . 
((while . ((<= . (i . (n . 
nil))) . ((setq . (r . ((* . 
(r . (i . nil))) . (i . ((+ . (i 
. (1 . nil))) . nil))))) . 
nil))) . (r . nil)))) . nil))))
これを点対表記に
これではLispに
拒絶反応を示す人が
いてもおかしくない
“Lisp? No!”
の恐怖
でも、
Lisperなら
(3 (5 (7) 11))
このS式を見たとき
(3 . ((5 . ((7 . 
nil) . (11 . 
nil))) . nil))
これを飛ばして
こうイメージする
nil
nil
nil
3
5
7 11
木構造
(ツリー)
ツリーを巡回する
● 全要素を出力する
● 全要素を合計する
● 特定の要素を探す
● …
※ブログねたの焼き直しです
方法1
● car方向とcdr方向をそれぞれ再帰的に辿る
● いちばんシンプルな方法
(defun traverse­tree (tree func)
  (if (atom tree)
      (or (null tree) (funcall func tree))
    (traverse­tree (car tree) func)
    (traverse­tree (cdr tree) func) ))
Emacs Lispで書くと
(defun traverse­tree (tree func)
  (mapc #'(lambda (x)
            (if (atom x)
                (or (null x) (funcall func x))
              (traverse­tree x func) ))
        tree ))
cdr方向をmapやループにしても
car方向は再帰が必要
方法2
● ループで辿る
● 戻る場所を外部のデータ構造に覚えておく
● 深さ優先ならスタック、幅優先ならキュー
実装は割愛
方法3
● 再帰も外部データも使わない方法
● 通ったコンスセルを破壊的に「120度回転」さ
せながら進む
● 3方向(car方向、cdr方向、戻り)
= 3回120度回転 = 360度回転 = 元に戻る
図解
car cdr
こっちに進む
car
cdr
こっち(元のcar)
に進みながら
120度回転
戻ったら次
(新しいcar)
car
cdr
戻ったら次
(新しいcar)
こっち(元のcar)
に進みながら
120度回転
car cdr
こっち(元のcar)
に進みながら
120度回転
carを辿っていくだけで
ツリーを一巡する
         ,. -‐'''''""¨¨¨ヽ
         (.___,,,... -ァァフ|          あ…ありのまま 今 起こった事を話すぜ!
          |i i|    }! }} //|
         |l、{   j} /,,ィ//|       『おれはcarを辿っていたと
        i|:!ヾ、_ノ/ u {:}//ヘ        思ったらいつのまにかツリーを一周していた』
        |リ u' }  ,ノ _,!V,ハ |
       /´fト、_{ル{,ィ'eラ , タ人        な… 何を言ってるのか わからねーと思うが
     /'   ヾ|宀| {´,)⌒`/ |<ヽトiゝ        おれも何をされたのかわからなかった…
    ,゙  / )ヽ iLレ  u' | | ヾlトハ〉
     |/_/  ハ !ニ⊇ '/:}  V:::::ヽ        頭がどうにかなりそうだった…
    // 二二二7'T'' /u' __ /:::::::/`ヽ
   /'´r -—一ァ‐゙T´ '"´ /::::/-‐  \    再帰だとかスタックだとか
   / //   广¨´  /'   /:::::/´ ̄`ヽ ⌒ヽ    そんなチャチなもんじゃあ 断じてねえ
  ノ ' /  ノ:::::`ー-、___/::::://       ヽ  }
_/`丶 /:::::::::::::::::::::::::: ̄`ー-{:::...       イ  もっと恐ろしいものの片鱗を味わったぜ…
(defun traverse­tree:spin (cns prev)
  (let ((next (car cns)))
    (rplaca cns (cdr cns))
    (rplacd cns prev)
    next ))
(defun traverse­tree (tree func)
  (let* ((marker "dummy")               ; unique object
         (cns tree) (prev marker) next )
    (while (not (eq (setq next
                          (traverse­tree:spin cns prev) )
                    marker ))
      (if (consp next)
          (setq prev cns cns next)
        (or (null next) (funcall func next))
        (setq prev next) ))))
Emacs Lispで書くと
● 元ネタは、20年ぐらい前に雑誌(bit?)の
エッセイかなにかでアイデアを見た記憶
● 詳細はぜんぜん覚えてない
● ご存知の方、教えてください
● 実践的ではない
● いくら関数型じゃなくても、無駄な破壊的操作はい
まどき流行らない?
DEMO
まとめ
● カッコは単なる格好
● ツリーですた
● 【緩募】元ネタの情報

Mais conteúdo relacionado

Destaque

メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRubyemasaka
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろうKota Mizushima
 
MATLABモデルご提供開始
MATLABモデルご提供開始MATLABモデルご提供開始
MATLABモデルご提供開始Tsuyoshi Horigome
 
TREE dynamics Program slide ver.1.0
TREE dynamics Program slide ver.1.0TREE dynamics Program slide ver.1.0
TREE dynamics Program slide ver.1.0Toyoki Hashimoto
 
skiplist&overlay-111030
skiplist&overlay-111030skiplist&overlay-111030
skiplist&overlay-111030Mikio Yoshida
 
挿入ソート
挿入ソート挿入ソート
挿入ソートs5yata
 
論文紹介:The wavelet matrix
論文紹介:The wavelet matrix論文紹介:The wavelet matrix
論文紹介:The wavelet matrixYuki Igarashi
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementationMITSUNARI Shigeo
 
木をめぐる混乱について
木をめぐる混乱について木をめぐる混乱について
木をめぐる混乱についてRyuichi Tanabe
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesYasuo Tabei
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今Yuki Igarashi
 
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナーKoichi Hamada
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門大樹 小倉
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界Preferred Networks
 

Destaque (17)

メタメタプログラミングRuby
メタメタプログラミングRubyメタメタプログラミングRuby
メタメタプログラミングRuby
 
Rubyの黒魔術
Rubyの黒魔術Rubyの黒魔術
Rubyの黒魔術
 
メタプログラミングって何だろう
メタプログラミングって何だろうメタプログラミングって何だろう
メタプログラミングって何だろう
 
MATLABモデルご提供開始
MATLABモデルご提供開始MATLABモデルご提供開始
MATLABモデルご提供開始
 
TREE dynamics Program slide ver.1.0
TREE dynamics Program slide ver.1.0TREE dynamics Program slide ver.1.0
TREE dynamics Program slide ver.1.0
 
skiplist&overlay-111030
skiplist&overlay-111030skiplist&overlay-111030
skiplist&overlay-111030
 
挿入ソート
挿入ソート挿入ソート
挿入ソート
 
論文紹介:The wavelet matrix
論文紹介:The wavelet matrix論文紹介:The wavelet matrix
論文紹介:The wavelet matrix
 
Wavelet matrix implementation
Wavelet matrix implementationWavelet matrix implementation
Wavelet matrix implementation
 
木をめぐる混乱について
木をめぐる混乱について木をめぐる混乱について
木をめぐる混乱について
 
Hash Tree
Hash TreeHash Tree
Hash Tree
 
Nazoki
NazokiNazoki
Nazoki
 
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data MatricesScalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
Scalable Partial Least Squares Regression on Grammar-Compressed Data Matrices
 
.NET Coreとツール類の今
.NET Coreとツール類の今.NET Coreとツール類の今
.NET Coreとツール類の今
 
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー
「樹木モデルとランダムフォレスト-機械学習による分類・予測-」-データマイニングセミナー
 
Pythonによる黒魔術入門
Pythonによる黒魔術入門Pythonによる黒魔術入門
Pythonによる黒魔術入門
 
ウェーブレット木の世界
ウェーブレット木の世界ウェーブレット木の世界
ウェーブレット木の世界
 

Mais de emasaka

ibus-skkをなんとかすっぺ会議
ibus-skkをなんとかすっぺ会議ibus-skkをなんとかすっぺ会議
ibus-skkをなんとかすっぺ会議emasaka
 
濁点の話
濁点の話濁点の話
濁点の話emasaka
 
GoBoLinuxを試した
GoBoLinuxを試したGoBoLinuxを試した
GoBoLinuxを試したemasaka
 
さくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークさくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークemasaka
 
みおぽん for CLI
みおぽん for CLIみおぽん for CLI
みおぽん for CLIemasaka
 
GNU make 4.0に何かいる
GNU make 4.0に何かいるGNU make 4.0に何かいる
GNU make 4.0に何かいるemasaka
 
長いの
長いの長いの
長いのemasaka
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発emasaka
 
Bash on Railsの逆襲
Bash on Railsの逆襲Bash on Railsの逆襲
Bash on Railsの逆襲emasaka
 

Mais de emasaka (11)

ibus-skkをなんとかすっぺ会議
ibus-skkをなんとかすっぺ会議ibus-skkをなんとかすっぺ会議
ibus-skkをなんとかすっぺ会議
 
濁点の話
濁点の話濁点の話
濁点の話
 
GoBoLinuxを試した
GoBoLinuxを試したGoBoLinuxを試した
GoBoLinuxを試した
 
さくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマークさくらのクラウドでh2oのベンチマーク
さくらのクラウドでh2oのベンチマーク
 
みおぽん for CLI
みおぽん for CLIみおぽん for CLI
みおぽん for CLI
 
GNU make 4.0に何かいる
GNU make 4.0に何かいるGNU make 4.0に何かいる
GNU make 4.0に何かいる
 
長いの
長いの長いの
長いの
 
人力
人力人力
人力
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
 
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
ゲットーの斜め上をゆくWebアプリケーションフレームワークの開発
 
Bash on Railsの逆襲
Bash on Railsの逆襲Bash on Railsの逆襲
Bash on Railsの逆襲
 

)の品格