SlideShare uma empresa Scribd logo
1 de 80
GAUCHEでマクロを書こう
ID:hnagamin(長嶺英朗)
2015.3.14
自己紹介
• ID: hnagamin(長嶺英朗)
• 京都大学工学部電気電子工学科1回
• 38代会計
• 2014年度の活動
• 競技プログラミング練習会2014
• On Lisp読書会2014
• 関数品評会
近況
• バイトつらかった
• 単位落とした
今日話すこと
• Schemeについて
• define-syntax / syntax-rules
• define-macro
• gensym
• マクロを書くときの注意
今日話さないこと
• syntax-case
• 継続
• 2種類の変数捕捉
• with-gensymsマクロ
• defanaphマクロ
//TODO: 例会講座でsyntax-caseの話をする
この講座の目標
• Schemeに興味を持つ
• Gaucheに興味を持つ
• Gaucheでマクロが書けるようになる
• マクロの力を認識する
対象
• LISPをあまり書いたことがない/知らない人
• 大学の講義でSchemeを触ったがマクロを書いたことがない人
• LISPerの方はマサカリを用意してください
SCHEMEとは
• LISP方言
• 二大方言(Common Lisp / Scheme)
• 言語仕様を小さくする努力がなされている
• R6RS
• 構文スコープを導入したLISP
• 継続のサポート
GAUCHEとは
• Scheme処理系の一つ
• 日本人(川合史朗)が開発
• 独自拡張によってSchemeなのにCommon Lisp的アトモスフィアが
溢れている[要出典]
SCHEMEの文法
括弧が多い
括弧は基本的に関数適用
(+ 1 2)
(define f (lambda (x y) (+ x y)))
(f 1 2)
(cons 200 300)
(car ‘(l i s p))
(cdr ‘(s c h e m e))
IF文がある
(if (> 2 1)
(print “2 is larger than 1”)
(print “1 is equal or larger than 2”))
関数がある
lambda式で関数が定義できる
((lambda (x y)
(list (* x x) (* y y)))
10 20)
;=> (100 400)
変数が定義できる(1)
• (let ((x 100) (y 200))
(print (+ x y)))
• let*とかletrecとかもあるよ!
変数が定義できる(2)
(define x 10)
(+ x 20)
(set! x 10000)
(+ x 20)
繰り返しがある
(let loop ((n 7) (value 1))
(if (zero? n)
value
(loop (- n 1) (* n value))))
「名前付きlet」という
リストがある
(list 1 2 3 4 5)
‘(1 2 3 4 5)
入れ子にもできる
‘(1 2 (3 4 (5)) () (6 7) 8)
S式
アトムまたはS式のリスト
よく見ると、SCHEMEのプログラムは
S式そのものである
• Schemeプログラムは結局ただのでかいリスト、Schemeプログ
ラムはリストが主役
• Schemeプログラムをリストとみなすと、Schemeプログラムを
こちゃこちゃするSchemeプログラムがかける
DEFINE-SYNTAX
NIL!マクロ
(set! x ‘()) という処理を短く書きたい
NIL!マクロ
(set! x ‘()) という処理を短く書きたい
変換前 (nil! x)
変換後 (set! x ‘())
NIL!マクロの実装
(define-syntax nil!
(syntax-rules ()
((_ x) (set! x ‘()))))
NIL!マクロが書けた
• マクロでコードを短く書けた
• 短く書くことで、本来人間が気にするべきだった部分をマク
ロに任せることができ、人間はよりプログラムの高次の部分
について考えることができるようになった
INCFマクロ
• 変数に格納されてい
る数を指定された数
だけ増加させる
• 増分が省略されてい
る場合は1だけ増やす
(define x 100)
(incf x 49)
x ;=> 149
(incf x)
x ;=> 150
INCFマクロ
(define-syntax incf
(syntax-rules ()
((_ x) (set! x (+ x 1))
((_ x var) (set! x (+ x var))))
FOR文を書きたい
(for (i 1 10)
(print i)
(print (* 2 i))
みたいな感じで書きたい
FOR文をどう展開するか
(for (i 1 10)
(print i)
(print (* 2 i))
(for-each
(lambda (i)
(print i)
(print (* 2 i))
(nanika 1 10))
FORマクロの実装
(define (range from to)
(if (>= from to)
(list from)
(cons from (range (+ 1 from) to))))
;(range 1 5) => (1 2 3 4 5)
FORマクロの実装
(define (range from to)
(if (>= from to)
(list from)
(cons from (range (+ 1 from) to))))
(define-syntax for
(syntax-rules ()
((_ (i a b) body ...)
(for-each (lambda (i) body ...)
(range a b)))))
追加仕様
(for (i from 1 to 10)
(print (* i i)))
みたいに書きたい
FOR文(改訂)
(define-syntax for
(syntax-rules (from to)
((_ (i a b) body ...)
(for-each (lambda (i) body ...)
(range a b)))
((_ (i from a to b) body ...)
(for (i a b) body ...))))
FOR文(改訂)
(define-syntax for
(syntax-rules (from to)
((_ (i a b) body ...)
(for-each (lambda (i) body ...)
(range a b)))
((_ (i from a to b) body ...)
(for (i a b) body ...))))
FOR文(改訂)
完璧
FOR文(改訂)
完璧(完璧ではない)
どこが良くない?
(define-syntax for
(syntax-rules (from to)
((_ (i a b) body ...)
(for-each (lambda (i) body ...)
(range a b)))
((_ (i from a to b) body ...)
(for (i a b) body ...))))
どこが良くない?
(define-syntax for
(syntax-rules (from to)
((_ (i a b) body ...)
(for-each (lambda (i) body ...)
(range a b)))
((_ (i from a to b) body ...)
(for (i a b) body ...))))
YOKUNAI
(for (i 1 500000000)
(print i))
YOKUNAI
(for-each
(lambda (i)
(print i))
(range 1 500000000))
YOKUNAI
(for-each
(lambda (i)
(print i))
(range 1 500000000))
このコードは500000000要素のリストを生成する
このコードは500000000要素のリストを生成する
DEFINE-MACRO
DEFINE-MACROで
FOR文の書き直し
• define-macroはGaucheの独自拡張
• define-macroでCommon Lispのマクロ並みの強さを持つマク
ロを書くことができる
• やってることはほぼ関数と同じ
• コンパイル時にS式を引数に受け取って評価し、S式を返す。
返されたS式はプログラム中に埋め込まれる
FOR文(二訂)
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind)))
`(let loop ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (loop (+ 1 ,i)))))))
なにこれ
バッククオート記法
S式を分かりやすく書くときに使える記法
`と,と,@を使う
バッククオート記法のルール
頭に ` をつけられた式は評価しない
ただし、頭に , をつけられた式は評価する
,@をつけられた式は評価した後括弧を外す
`(x ,y)
評価しない 評価する
練習問題
練習問題
(define x 20)
(define y 30)
`(+ x y) ;=> (+ x y)
練習問題
(define x 20)
(define y 30)
`(+ ,x ,y) ;=> (+ 20 30)
練習問題
(define x 20)
(define y ‘(30 40))
`(x ,@y) ;=> (20 30 40)
練習問題
(define x 20)
(define y 30)
`(,(+ x y) (+ x y) (+ x ,y) ,@(cons `(,x ,y) (+ x y)))
;=> (50 (+ x y) (+ x 30) (20 30) . 50)
何の話だっけ
FOR文(二訂)
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind)))
`(let loop ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (loop (+ 1 ,i)))))))
FOR文(二訂)
完璧
FOR文(二訂)
完璧(完璧ではない)
どこが良くない?
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind)))
`(let loop ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (loop (+ 1 ,i)))))))
どこが良くない?
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind)))
`(let loop ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (loop (+ 1 ,i)))))))
YOKUNAI
(for (loop 1 5)
(print loop))
; このコードは1, 2, 3, 4, 5を表示してほしい
YOKUNAI
(let loop ((loop 1))
(if (>= loop 5)
(begin (print loop))
(begin (print loop) (loop (+ 1 loop)))))
YOKUNAI
(let loop ((loop 1))
(if (>= loop 5)
(begin (print loop))
(begin (print loop) (loop (+ 1 loop)))))
invalid application: (1 2)
良くない解決策
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind)))
`(let asjdiwoqwe ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (asjdiwoqwe (+ 1 ,i)))))))
変数捕捉
• マクロが意図とは異なる環境の変数を参照すること
• 捕捉には2種類ある
• define-syntaxは変数捕捉を起こさない「健全なマクロ
(Hygienic macro)」だが、変数捕捉を起こしうるマクロより記
述力が弱い
• define-macroは変数捕捉を起こしうるマクロでありdefine-
syntaxより記述力が強いが、たまに変数捕捉でえげつない問
題を生じうる
GENSYM
• シンボルを生成する
• ここで生成されたシンボルは、ソースコード中に出てくる他
のどのシンボルとも等しくないことが保障されている
GENSYMの使用例
(gensym)
;=> #:G100
(gensym)
;=> #:G101
FOR文(三訂)
(define-macro (for bind . body)
(let ((i (car bind))
(from (cadr bind))
(to (caddr bind))
(loop (gensym)))
`(let ,loop ((,i ,from))
(if (>= ,i ,to)
(begin ,@body)
(begin ,@body (,loop (+ 1 ,i)))))))
AIFマクロ
(define *table*
‘((1 one)
(2 two)
(3 three)))
(print
(aif (assoc 1 *table*)
(car (cdr it))
“Not Found”)))
AIFマクロ
• aifは条件節の返す値をitに束
縛して、then節とelse節で使
えるようにする
• 変数捕捉をうまく用いている
(define *table*
‘((1 one)
(2 two)
(3 three)))
(print
(aif (assoc 1 *table*)
(car (cdr it))
“Not Found”)))
【alist】
((key1 value1) (key2 value2) …)
の形のリスト
連想配列っぽく使える
【assoc】
(assoc key alist)
alist中からkeyを探す。
keyが存在したら(key value)を返す。
さもなくば#fを返す。
AIFマクロ
• aifは条件節の返す値をitに束
縛して、then節とelse節で使
えるようにする
• 変数捕捉をうまく用いている
(define *table*
‘((1 one)
(2 two)
(3 three)))
(print
(aif (assoc 1 *table*)
(car (cdr it))
“Not Found”)))
実装
(define-macro (aif predicate then-clause else-clause)
`(let ((it ,predicate))
(if it ,then-clause ,else-clause)))
まとめ
• Gaucheには2種類のマクロがある
• 健全なマクロ/健全でないマクロ
• マクロをうまく用いるとソースコードを短く簡潔にできる
• マクロ定義を慎重に行わないと、たまにえげつない問題を起
こしうる
関数品評会
関数品評会
• 7月から関数品評会に参加しました
• 関数品評会
• 品評会で発表したマクロを紹介します
アリティの固定
(define 1- (cut - <> 1))
(define (repeat n fn)
(let loop ((m n) (x '()))
(if (= m 0)
x
(loop (1- m) (cons (fn) x)))))
(define-macro (*-ary n fn)
(let ((args (repeat n gensym)))
`(lambda ,args (,fn ,@args))))
; (arity (*-ary 4 +))
; => 4
グローバル関数を使わない
非決定性オペレータ
https://gist.github.com/1995hnagamin/252ed5638a0977205f03

Mais conteúdo relacionado

Mais procurados

ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門増田 亨
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話Yoshitaka Kawashima
 
reduxのstate設計の話
reduxのstate設計の話reduxのstate設計の話
reduxのstate設計の話ayatas0623
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD増田 亨
 
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)Tomoaki Uchida
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?Moriharu Ohzu
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善Ito Takayuki
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころTakuto Wada
 
型安全性入門
型安全性入門型安全性入門
型安全性入門Akinori Abe
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfestay_taka_23
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)Takanori Sejima
 
Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)Scott Wlaschin
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門Kohei Tokunaga
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みChihiro Ito
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021Hiroshi Tokumaru
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話y-uti
 
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術Masaya Aoyama
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法Tetsutaro Watanabe
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugMasatoshi Tada
 

Mais procurados (20)

ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
 
強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話強いて言えば「集約どう実装するのかな、を考える」な話
強いて言えば「集約どう実装するのかな、を考える」な話
 
reduxのstate設計の話
reduxのstate設計の話reduxのstate設計の話
reduxのstate設計の話
 
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDDドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
 
SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)SQLアンチパターン(インデックスショットガン)
SQLアンチパターン(インデックスショットガン)
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
CircleCIのinfrastructureを支えるTerraformのCI/CDパイプラインの改善
 
TDD のこころ
TDD のこころTDD のこころ
TDD のこころ
 
型安全性入門
型安全性入門型安全性入門
型安全性入門
 
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
形式手法と AWS のおいしい関係。- モデル検査器 Alloy によるインフラ設計技法 #jawsfesta
 
sysloadや監視などの話(仮)
sysloadや監視などの話(仮)sysloadや監視などの話(仮)
sysloadや監視などの話(仮)
 
Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)Domain Modeling Made Functional (DevTernity 2022)
Domain Modeling Made Functional (DevTernity 2022)
 
コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門コンテナ未経験新人が学ぶコンテナ技術入門
コンテナ未経験新人が学ぶコンテナ技術入門
 
Javaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組みJavaはどのように動くのか~スライドでわかるJVMの仕組み
Javaはどのように動くのか~スライドでわかるJVMの仕組み
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
PHP の GC の話
PHP の GC の話PHP の GC の話
PHP の GC の話
 
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
サイバーエージェントにおけるプライベートコンテナ基盤AKEを支える技術
 
MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法MongoDBが遅いときの切り分け方法
MongoDBが遅いときの切り分け方法
 
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
PHP版レガシーコード改善に役立つ新パターン #wewlc_jp
 
Java ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsugJava ORマッパー選定のポイント #jsug
Java ORマッパー選定のポイント #jsug
 

Destaque

Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Shoot Morii
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編京大 マイコンクラブ
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったCHY72
 
数値解析と物理学
数値解析と物理学数値解析と物理学
数値解析と物理学すずしめ
 
タイ文字と若干情報科学[修正版]
タイ文字と若干情報科学[修正版]タイ文字と若干情報科学[修正版]
タイ文字と若干情報科学[修正版]. きぷ
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方k maztani
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
部の紹介_テンプレート
部の紹介_テンプレート部の紹介_テンプレート
部の紹介_テンプレート_ uruchan1997
 
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったこと
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったことソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったこと
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったことYoshihito Kuranuki
 

Destaque (20)

Firefox Add-on SDK 入門
Firefox Add-on SDK 入門Firefox Add-on SDK 入門
Firefox Add-on SDK 入門
 
ECMAScript没proposal追悼式
ECMAScript没proposal追悼式ECMAScript没proposal追悼式
ECMAScript没proposal追悼式
 
Pietのエディタを作った話
Pietのエディタを作った話Pietのエディタを作った話
Pietのエディタを作った話
 
Topological data analysis
Topological data analysisTopological data analysis
Topological data analysis
 
SSL で守られる生活
SSL で守られる生活SSL で守られる生活
SSL で守られる生活
 
GoでMinecraftっぽいの作る
GoでMinecraftっぽいの作るGoでMinecraftっぽいの作る
GoでMinecraftっぽいの作る
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編暗号技術入門 秘密の国のアリス 総集編
暗号技術入門 秘密の国のアリス 総集編
 
Altseed
AltseedAltseed
Altseed
 
FM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作ったFM音源をいじれるWebサービスを作った
FM音源をいじれるWebサービスを作った
 
数値解析と物理学
数値解析と物理学数値解析と物理学
数値解析と物理学
 
タイ文字と若干情報科学[修正版]
タイ文字と若干情報科学[修正版]タイ文字と若干情報科学[修正版]
タイ文字と若干情報科学[修正版]
 
フォントの選び方・使い方
フォントの選び方・使い方フォントの選び方・使い方
フォントの選び方・使い方
 
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
部の紹介_テンプレート
部の紹介_テンプレート部の紹介_テンプレート
部の紹介_テンプレート
 
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったこと
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったことソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったこと
ソニックガーデン「部活」制度の紹介 〜 イノベーションを起こすために必要だったこと
 
鈴鹿高専ロボコン 部活紹介と技術紹介
鈴鹿高専ロボコン 部活紹介と技術紹介鈴鹿高専ロボコン 部活紹介と技術紹介
鈴鹿高専ロボコン 部活紹介と技術紹介
 
すごいスライド(Lazy K 紹介)
すごいスライド(Lazy K 紹介)すごいスライド(Lazy K 紹介)
すごいスライド(Lazy K 紹介)
 
Ultra piet
Ultra pietUltra piet
Ultra piet
 
แก้ไขประการ 3 โครงการ
แก้ไขประการ 3 โครงการแก้ไขประการ 3 โครงการ
แก้ไขประการ 3 โครงการ
 

Semelhante a Gaucheでマクロを書こう

Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門masatora atarashi
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門Shohei Arai
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践LINE Corporation
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法博文 斉藤
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Ra Zon
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016kyoto university
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門Ishibashi Ryosuke
 
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
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんかcch-robo
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Takeshi Arabiki
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行gree_tech
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成Akineko Shimizu
 

Semelhante a Gaucheでマクロを書こう (20)

Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門JavaScript経験者のためのGo言語入門
JavaScript経験者のためのGo言語入門
 
C++14言語編
C++14言語編C++14言語編
C++14言語編
 
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
 
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
 
Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]Scalaで萌える関数型プログラミング[完全版]
Scalaで萌える関数型プログラミング[完全版]
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
秀スクリプトの話
秀スクリプトの話秀スクリプトの話
秀スクリプトの話
 
第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016第2回 JavaScriptから始めるプログラミング2016
第2回 JavaScriptから始めるプログラミング2016
 
JavaScript 非同期処理 入門
JavaScript非同期処理 入門JavaScript非同期処理 入門
JavaScript 非同期処理 入門
 
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)
 
Flutterを体験してみませんか
Flutterを体験してみませんかFlutterを体験してみませんか
Flutterを体験してみませんか
 
Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理Rのデータ構造とメモリ管理
Rのデータ構造とメモリ管理
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
とあるFlashの自動生成
とあるFlashの自動生成とあるFlashの自動生成
とあるFlashの自動生成
 

Mais de Hideaki Nagamine

PietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しいPietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しいHideaki Nagamine
 
Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Hideaki Nagamine
 
Pietソースコード精読
Pietソースコード精読Pietソースコード精読
Pietソースコード精読Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回Hideaki Nagamine
 
競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回Hideaki Nagamine
 
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」Hideaki Nagamine
 

Mais de Hideaki Nagamine (9)

PietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しいPietでLISP処理系を書くのは難しい
PietでLISP処理系を書くのは難しい
 
Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告
 
フェーザとか
フェーザとかフェーザとか
フェーザとか
 
Pietソースコード精読
Pietソースコード精読Pietソースコード精読
Pietソースコード精読
 
競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回競技プログラミング練習会2015 Normal 第4回
競技プログラミング練習会2015 Normal 第4回
 
競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回競技プログラミング練習会2015 Normal 第3回
競技プログラミング練習会2015 Normal 第3回
 
競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回競技プログラミング練習会2015 Normal 第1回
競技プログラミング練習会2015 Normal 第1回
 
競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回競技プログラミング練習会2015 Normal 第2回
競技プログラミング練習会2015 Normal 第2回
 
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
 

Gaucheでマクロを書こう