SlideShare ist ein Scribd-Unternehmen logo
1 von 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

Weitere ähnliche Inhalte

Was ist angesagt?

社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみたIosif Takakura
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。(^-^) togakushi
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Takahiro Harada
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミングPreferred Networks
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Masahito Zembutsu
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexprGenya Murakami
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14Ryo Suzuki
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccYuji Kubota
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング佑哉 廣岡
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」Masahito Zembutsu
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなKentaro Matsui
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例Fixstars Corporation
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015CODE BLUE
 

Was ist angesagt? (20)

社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた社内のマニュアルをSphinxで作ってみた
社内のマニュアルをSphinxで作ってみた
 
tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。tcpdumpとtcpreplayとtcprewriteと他。
tcpdumpとtcpreplayとtcprewriteと他。
 
Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)Introduction to OpenCL (Japanese, OpenCLの基礎)
Introduction to OpenCL (Japanese, OpenCLの基礎)
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編Dockerfile を書くためのベストプラクティス解説編
Dockerfile を書くためのベストプラクティス解説編
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
中3女子でもわかる constexpr
中3女子でもわかる constexpr中3女子でもわかる constexpr
中3女子でもわかる constexpr
 
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
Plan 9のお話
Plan 9のお話Plan 9のお話
Plan 9のお話
 
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_cccConcurrent Mark-Sweep Garbage Collection #jjug_ccc
Concurrent Mark-Sweep Garbage Collection #jjug_ccc
 
llvm入門
llvm入門llvm入門
llvm入門
 
Marp Tutorial
Marp TutorialMarp Tutorial
Marp Tutorial
 
JVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニングJVMのGCアルゴリズムとチューニング
JVMのGCアルゴリズムとチューニング
 
コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」コンテナの作り方「Dockerは裏方で何をしているのか?」
コンテナの作り方「Dockerは裏方で何をしているのか?」
 
テスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるなテスト文字列に「うんこ」と入れるな
テスト文字列に「うんこ」と入れるな
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例いまさら聞けないarmを使ったNEONの基礎と活用事例
いまさら聞けないarmを使ったNEONの基礎と活用事例
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
C++の黒魔術
C++の黒魔術C++の黒魔術
C++の黒魔術
 

Andere mochten auch

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
 
Transforming Cities: Visions of a better future
Transforming Cities: Visions of a better futureTransforming Cities: Visions of a better future
Transforming Cities: Visions of a better futureThe Rockefeller Foundation
 

Andere mochten auch (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 โครงการ
 
Transforming Cities: Visions of a better future
Transforming Cities: Visions of a better futureTransforming Cities: Visions of a better future
Transforming Cities: Visions of a better future
 

Ähnlich wie Gaucheでマクロを書こう

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
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
 

Ähnlich wie Gaucheでマクロを書こう (20)

C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
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のデータ構造とメモリ管理
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 

Mehr von 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
 

Mehr von 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でマクロを書こう