SlideShare a Scribd company logo
1 of 121
Download to read offline
PietでLISP処理系を書くのは難しい
2015.08.21
長嶺英朗
この発表者について
長嶺英朗(Hideaki Nagamine)
Twitter: @hnagamin
京大マイコンクラブ所属
Piet歴 4ヶ月くらい
Scheme歴 2年くらい
YAPC
YAPC
=Piet
今日の目標
• Pietについて知ってもらう
• とにかくPietが楽しいってことを知ってもらう
• 今日の夜Pietしたくなるように仕向ける
• ここにいる全員をKMCに入れてuidを使い切る
目次
1. Pietについてなんとなく分かる
2. 簡単なプログラムの実装
3. PietでLISP処理系を作る
1.Pietについてなんとなく分かる
Pietを知っていた方
Piet書いたことがある方
Pietを業務で使っている方
LISPを業務で使っている方
Piet
• David Morgan-Marが考案した
難解プログラミング言語
• スタック指向
Piet
• David Morgan-Marが考案した
難解プログラミング言語
• スタック指向
• 画像がソースコード
画像がソースコード
画像がソースコード
画像がソースコード
言語仕様
命令
• Pietのもう一つの特徴はその豊富な命令セット
• 難解言語のくせに17種類も命令がある
– 8 << 17
命令
• 命令はブロック間の色の差で表される
– 6*3-1 = 17
* ADD DIV GREATER DUP IN(C)
PUSH SUB MOD POINTER ROLL OUT(N)
POP MUL NOT SWITCH IN(N) OUT(C)
命令(入出力)
• in(number), in(character)
– 標準入力からread
• out(number), out(character)
– 標準出力へwrite
とにかく便利
命令(演算)
• add, subtract, multi, divide
– 四則演算。2個popして計算結果をpush
• greater
– 2個popして(x<y?1:0)をpush
• not
– 1個pop(xとする)して(x==0?1:0)をpush
Direction PointerとCodel Chooser
• Pietのプログラムは点がソースコード上を
縦横無尽に駆け回ることで実行される
• この駆け回り方を決めるのがDPとCC
– 点はDirection Pointerの方向に向かって最も
Codel Chooserの向きに位置している点に移
動する
この辺は「Pietのエディタを作った話」
を読むといいでしょう
右のプログラムを例に
なんとなく説明します
なお、このソースコード
は2数の最大公約数を
求めるものです
動作例
右のプログラムを例に
なんとなく説明します
”24 60”を入力したとき
のことを考えます
動作例
プログラムの実行は
ソースコードの左上から
始まります
動作例
DP:→ CC:左
[]
Input(number)
は数字の入力を
行います
スタックに24が乗ります
動作例
DP:→ CC:左
[24]
Input(number)
も数字の入力を
行います
スタックに60が乗ります
動作例
DP:→ CC:左
[24,60]
Input(number)
も数字の入力を
行います
スタックに60が乗ります
こんな感じで続きます
動作例
DP:→ CC:左
[24,60]
Input(number)
Duplicateはスタックの
先頭要素をコピーして
新しく乗せます
動作例
DP:→ CC:左
[24,60,60]
duplicate
次に行くコードブロック
には2通り考えられます
動作例
DP:→ CC:左
[24,60,60]
duplicate
次に行くコードブロック
には2通り考えられます
しかしCodel Chooserが
左なので、進行方向に
対してもっとも左側の
ブロックが選ばれます
動作例
DP:→ CC:左
[24,60,60]
duplicate
これはpushです
3が乗せられるのは、
赤いブロックの大きさが
3だからです
動作例
DP:→ CC:左
[24,60,60,3]
push
これもpushです
1が乗ります
動作例
DP:→ CC:左
[24,60,60,3,1]
push
次に行くべきところは
行き止まりです
動作例
DP:→ CC:左
[24,60,60,3,1]
push
このとき、次の手順で
DPとCCが変わります
CC変更→DP90度右回転
→CC変更→DP90度右…
動作例
DP:→ CC:右
[24,60,60,3,1]
push
8回行うと元の状態に
戻り、そこでプログラム
が終了します
動作例
DP:→ CC:右
[24,60,60,3,1]
push
この場合CCが変わっても
まだ行き止まりなので、
さらにDPが変わります
動作例
DP:↓ CC:右
[24,60,60,3,1]
push
これはrollです
rollは2引数をとり、
その数に応じて
スタックの要素を回転
させます
動作例
DP:↓ CC:右
[60,24,60]
roll
[24,60,60,3,1]
[60,24,60]
↓
modは剰余を返します
動作例
DP:↓ CC:右
[60,24]
mod
duplicate
動作例
DP:↓ CC:右
[60,24,24]
duplicate
notは(x==0?1:0)
みたいなものです
動作例
DP:← CC:左
[60,24,0]
not
switchは先頭要素を
取りだして、
その回数だけCCを
変更します
0なので何も起きません
動作例
DP:← CC:左
[60,24]
switch
switchは先頭要素を
取りだして、
その回数だけCCを
変更します
0なので何も起きません
動作例
DP:← CC:左
[60,24]
switch
よってこっちに進みます
duplicate
動作例
DP:← CC:左
[60,24,24]
duplicate
黒は行き止まりなので
上に進みます
白いブロックはただ通
り抜けます
このとき何もしないと
いう仕様になってます
動作例
DP:↑ CC:右
[60,24,24]
(none)
push 3
動作例
DP:→ CC:左
[60,24,24,3]
push
push 1
動作例
DP:→ CC:左
[60,24,24,3,1]
push
roll 3,1
動作例
DP:↓ CC:右
[24,60,24]
roll
mod
動作例
DP:↓ CC:右
[24,12]
mod
duplicate
動作例
DP:↓ CC:右
[24,12,12]
duplicate
not
動作例
DP:← CC:左
[24,12,0]
not
switch
動作例
DP:← CC:左
[24,12]
switch
duplicate
動作例
DP:← CC:左
[24,12,12]
duplicate
何もしません
動作例
DP:↑ CC:右
[24,12,12]
(none)
push 3
動作例
DP:→ CC:左
[24,12,12,3]
push
push 1
動作例
DP:→ CC:左
[24,12,12,3,1]
push
roll 3,1
動作例
DP:↓ CC:右
[12,24,12]
roll
mod
動作例
DP:↓ CC:右
[12,0]
mod
duplicate
動作例
DP:↓ CC:右
[12,0,0]
duplicate
not
動作例
DP:← CC:左
[12,0,1]
not
switch
ここでCCが変わります
動作例
DP:← CC:右
[12,0]
switch
すると、進行方向右側は
こっちなので黄色のブ
ロックに進みます
dup→not→switchや
dup→not→pointerなど
こういう処理は頻出です
動作例
DP:← CC:右
[12,0]
switch
あとは、popしてoutput
するだけです
“12”と出力されます
動作例
DP:← CC:右
[]
output(number)
赤いブロックに一度
入ってしまうとDP/CCに
関係なく出られません
ここでプログラムが
終了します
動作例
はい
環境
環境
• インターネットにPiet処理系がいっぱいある
• いくつかかいつまんで紹介します
PietDev
• ブラウザ上で動く
• エディタとして使うとちょっとつらい
Pidet
• KMC現代表のID:damaが作った開発環境
• とにかく便利、細かい親切がいっぱいあって
とにかく便利
Pidet
• KMC現代表のID:damaが作った開発環境
• とにかく便利、細かい親切がいっぱいあって
とにかく便利
• 非公開なので、入手したい方はKMCに入会
してください
はい
cpan Piet::Interpreter
Piet::Interpreter
• Piet処理系のPerl実装
• コマンドラインから使える
• in(number)が整数を読み込んでない…?
2.簡単なプログラムの実装
CGIアプリケーション
CGIアプリケーション
CGIアプリケーション
#!/usr/bin/perl
print `piet helloworld.png`;
逆ポーランド電卓
逆ポーランド電卓
• “1 2 +”を入力したら3を出力するようなやつ
• IN(C) で1文字ずつ見て、数字だったらスタック
に積み、演算子だったらスタックから2つ取り
計算結果を積む処理をひたすら繰り返す
逆ポーランド電卓
3.PietでLISP処理系を作る
この章で作るLISP
• λ式と整数を扱う
– リストとかは頑張ってエンコードしてください
• マクロなし
• defineなし
– 頑張ってλ式使ってください
文法のイメージ
<プログラム> := <S式> “¥n”
<S式> := <要素> | “(“ <S式>+ ”)”
<要素> := <整数> | <λ式> | <演算子>
<λ式> := “<“ <変数> <S式> “>”
<整数> := [0-9]+
<変数> := [^+-*/()<>0-9¥n]
<演算子> := “+” | “-” | “*” | “/”
プログラム例
• 100
• <x x>
• (+ 20 (* 20 30))
• ((<f <x (f (f x))>> <x (+ x x)>) 10)
戦略
• 最も左側の適用から処理していく
– 閉じ括弧を見つけるたびに、対応する開き括弧の
次の要素を見てその値に応じて分岐する
– <なら関数適用、[+-*/]なら整数の計算
スタックの扱い
• 仮想的に2つのスタックを使う
– 文字列用と環境用
• スタック上には整数しか保存できないので、
下位2ビットを使って頑張る
• 下位ビットを使うとmodが使えて便利
00: 整数 01: 文字
10: 制御用の値 11: 変数名
環境
• |<変数名> <値> 形式で変数-値ペアを保存
• 適用を見つけるたびに環境に突っ込む
• 入力文字列に!を適当に挿入し、!を再び読み
取ったとき環境のトップにあるペアをpopする
– 例: ((<x (+ x 2)> )
関数
• 入力文字列をそのまま
保存
• 適用されるたびに:
– 本体を取り出して置換
– 環境にペアを保存
(<x (+ x x)> 42)
¥
(+ x x)
¥|x 42
変数評価
• 環境をrollしながら変数を探す
• この時、もっとも上に積まれている変数を選ぶ
• 面倒なので変数がないときは無限ループ
– 当然の報い
– ¥に到達したらエラーにするみたいな処理は可能
大丈夫その設計?
• Funarg問題を抱えていてとにかく厳しい
• λ式を環境に突っ込むときに内部の変数を
ちゃんと展開すればできる…?
– 良い方法が思いつきません
– つよい人のアドバイスをお待ちしております
ツール
ソースコード自動生成
• 自動生成の助けを借りる
• Pietで直にLISPを実装するのには
人生は短すぎる
nna774/piet-automata
nna774/piet-automata
中間言語PASからPietのソースコードを生成する
PUSH 1
DUP
ADD
PUSH 1
SUB
OUTN
充実した命令セット
• PUSH/POP/DUP/ROLL
• ADD/SUB/MUL/DIV/MOD/NOT/GREATER
• INN/INC/OUTN/OUTC
• HALT/LABEL/JMP/JEZ
充実した命令セット
• PUSH/POP/DUP/ROLL
• ADD/SUB/MUL/DIV/MOD/NOT/GREATER
• INN/INC/OUTN/OUTC
• HALT/LABEL/JMP/JEZ
充実した命令セット
HALT
プログラムを終了する。
充実した命令セット
LABEL <name>
JMP <name>
JMP <name>するとLABEL <name>に飛ぶ
• goto的な
充実の命令セット
JEZ <name>
(=JMP Equal Zero)スタックの先頭要素を取り、
それが0ならLABEL <name>に飛ぶ
primenumber/pasxx
primenumber/pasxx
• PASにコンパイルされる言語
– AltPAS的な立ち位置
• 仮想的に複数のスタックを扱える
複数のスタックを扱える
[[10,20,30,40], [50,60]]
[10, 20, 30, 40, 4, 50, 60, 2, 8]
さらに充実した命令セット
• PUSH/POP/DUP/ROLL
• ADD/SUB/MUL/DIV/MOD/NOT/GREATER
• INN/INC/OUTN/OUTC
• HALT/LABEL/JMP/JEZ
• TOGGLE/NEW
さらに充実した命令セット
• PUSH/POP/DUP/ROLL
• ADD/SUB/MUL/DIV/MOD/NOT/GREATER
• INN/INC/OUTN/OUTC
• HALT/LABEL/JMP/JEZ
• TOGGLE/NEW
充実した命令セット
NEW
新しい空のスタックをひとつ作る。
充実した命令セット
TOGGLE
スタックの順番をひとつ回転させる。回転は
ROLLと同じ要領で、一番上のスタックを一番下
に移動させ他のスタックを一つずつ上にする。
[[10,20],[],[30,40,50],[60]]
[[60],[10,20],[],[30,40,50]]
他にもいろいろある
• nna774/piet-testutil
• 1995hnagamin/pas-interpreter
…で、実装できたの?
• とにかくバグりまくってる
• 環境を片付ける用の”!”を適当につけまくった
せいで変数が消失しまくっている
– ((<f <x (f (f x))> <x (+ x x)>) 10)の
外側のfを評価しようとしたときにはfの束縛が消
えている
とにかく厳しい
とにかく厳しい
とにかく厳しい
現況
• 次の文字列をちゃんと計算できる
– (* (+ 1 2) (- 13 3))
– (<x (+ x x)> 100)
• λ式がネストすると変数と環境周りでいっぱい
問題が起こる
今後の展望
今後の展望
• 環境をちゃんと扱えるようにする
• piet-automataやpasxxの発展
– より少ない面積のソースコードを生成したい
– マクロがほしい
– 関数がほしい
– とにかく抽象化の仕組みがほしい
まとめ
Piet最高! 一番好きな言語です

More Related Content

Viewers also liked (13)

Pietソースコード精読
Pietソースコード精読Pietソースコード精読
Pietソースコード精読
 
実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編
 
CUI3D
CUI3DCUI3D
CUI3D
 
BFmeta
BFmetaBFmeta
BFmeta
 
Ultra piet
Ultra pietUltra piet
Ultra piet
 
Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告Pietでlisp処理系を書くのは難しい 進捗報告
Pietでlisp処理系を書くのは難しい 進捗報告
 
お絵かきをはじめよう!
お絵かきをはじめよう!お絵かきをはじめよう!
お絵かきをはじめよう!
 
Code Golf
Code GolfCode Golf
Code Golf
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
 
Pietのエディタを作った話
Pietのエディタを作った話Pietのエディタを作った話
Pietのエディタを作った話
 
文字コード基礎論A
文字コード基礎論A文字コード基礎論A
文字コード基礎論A
 
C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回C#でゲームを作る2016 第8回
C#でゲームを作る2016 第8回
 

Similar to PietでLISP処理系を書くのは難しい

自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -Ogushi Masaya
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Yusaku Kawaguchi
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201t2tarumi
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用Nobuaki Oshiro
 
BotとWikiを使った試験的な並列プログラミング
BotとWikiを使った試験的な並列プログラミングBotとWikiを使った試験的な並列プログラミング
BotとWikiを使った試験的な並列プログラミングTakashi Yamanoue
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011finalMikio Kubo
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dpKensuke Otsuki
 
『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆5mingame2
 
女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2
 女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2 女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2
女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2Satoru Tokuhisa
 
Chainerで学ぶdeep learning
Chainerで学ぶdeep learningChainerで学ぶdeep learning
Chainerで学ぶdeep learningRetrieva inc.
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめgion_XY
 
Globally and Locally Consistent Image Completion
Globally and Locally Consistent Image CompletionGlobally and Locally Consistent Image Completion
Globally and Locally Consistent Image Completionharmonylab
 
pythonでオフィス快適化計画
pythonでオフィス快適化計画pythonでオフィス快適化計画
pythonでオフィス快適化計画Kazufumi Ohkawa
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
#経済学のための実践的データ分析 11. データのビジュアライゼーション
#経済学のための実践的データ分析 11. データのビジュアライゼーション#経済学のための実践的データ分析 11. データのビジュアライゼーション
#経済学のための実践的データ分析 11. データのビジュアライゼーションYasushi Hara
 

Similar to PietでLISP処理系を書くのは難しい (20)

自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
自然言語処理に適した ニューラルネットのフレームワーク - - - DyNet - - -
 
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
SSII2022 [TS3] コンテンツ制作を支援する機械学習技術​〜 イラストレーションやデザインの基礎から最新鋭の技術まで 〜​
 
Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習Nagoya.R #12 入門者講習
Nagoya.R #12 入門者講習
 
K010 appstat201201
K010 appstat201201K010 appstat201201
K010 appstat201201
 
Code iq×japanr 公開用
Code iq×japanr 公開用Code iq×japanr 公開用
Code iq×japanr 公開用
 
Tokyo r30 beginner
Tokyo r30 beginnerTokyo r30 beginner
Tokyo r30 beginner
 
BotとWikiを使った試験的な並列プログラミング
BotとWikiを使った試験的な並列プログラミングBotとWikiを使った試験的な並列プログラミング
BotとWikiを使った試験的な並列プログラミング
 
Or seminar2011final
Or seminar2011finalOr seminar2011final
Or seminar2011final
 
Optimization night 4_dp
Optimization night 4_dpOptimization night 4_dp
Optimization night 4_dp
 
Tokyo r27
Tokyo r27Tokyo r27
Tokyo r27
 
『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆『こなへん』ができるまで ☆リリース直前編☆
『こなへん』ができるまで ☆リリース直前編☆
 
女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2
 女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2 女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2
女子美術大学メディアアート演習ⅡB 2012 Fall 第2回 2/2
 
Chainerで学ぶdeep learning
Chainerで学ぶdeep learningChainerで学ぶdeep learning
Chainerで学ぶdeep learning
 
Cython ことはじめ
Cython ことはじめCython ことはじめ
Cython ことはじめ
 
Globally and Locally Consistent Image Completion
Globally and Locally Consistent Image CompletionGlobally and Locally Consistent Image Completion
Globally and Locally Consistent Image Completion
 
pythonでオフィス快適化計画
pythonでオフィス快適化計画pythonでオフィス快適化計画
pythonでオフィス快適化計画
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
PFI Christmas seminar 2009
PFI Christmas seminar 2009PFI Christmas seminar 2009
PFI Christmas seminar 2009
 
Scrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pubScrum alliance regional gathering tokyo 2013 pub
Scrum alliance regional gathering tokyo 2013 pub
 
#経済学のための実践的データ分析 11. データのビジュアライゼーション
#経済学のための実践的データ分析 11. データのビジュアライゼーション#経済学のための実践的データ分析 11. データのビジュアライゼーション
#経済学のための実践的データ分析 11. データのビジュアライゼーション
 

More from 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
 
Gaucheでマクロを書こう
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こうHideaki Nagamine
 
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」Hideaki Nagamine
 

More from Hideaki Nagamine (7)

フェーザとか
フェーザとかフェーザとか
フェーザとか
 
競技プログラミング練習会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回
 
Gaucheでマクロを書こう
Gaucheでマクロを書こうGaucheでマクロを書こう
Gaucheでマクロを書こう
 
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」On Lisp読書会2014 第3回「第2章 関数 (つづき)」
On Lisp読書会2014 第3回「第2章 関数 (つづき)」
 

PietでLISP処理系を書くのは難しい