お仕事にまったく役にたたない内容のコードレビューやりたいと思います。

Slides:



Advertisements
Similar presentations
2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
Advertisements

和田俊和 資料保存場所 /2/26 文法と言語 ー正規表現とオートマトンー 和田俊和 資料保存場所
Generic programming と STL
プログラミング演習II 2004年11月 30日(第6回) 理学部数学科・木村巌.
プログラミング言語論 関数型プログラミング言語 水野嘉明
JavaScript プログラミング入門 2006/11/10 神津.
京都大学情報学研究科 通信情報システム専攻 湯淺研究室 M2 平石 拓
稲葉 一浩 (k.inaba) Python と プログラミングコンテスト 稲葉 一浩 (k.inaba)
プログラミング演習Ⅱ 第12回 文字列とポインタ(1)
Ibaraki Univ. Dept of Electrical & Electronic Eng.
授業展開#11 コンピュータは 何ができるか、できないか.
型宣言 (Type Declarations)
OSとコマンド OS:コンピュータを使うための基本プログラム コマンド:OS上で使用できる命令 OS本体であるカーネルの内部コマンド
型宣言(Type Declarations)
2012年度 計算機システム演習 第4回 白幡 晃一.
プログラミング演習II 2004年10月19日(第1回) 理学部数学科・木村巌.
第6章 2重ループ&配列 2重ループと配列をやります.
条件式 (Conditional Expressions)

プログラミング論 II 電卓,逆ポーランド記法電卓
アルゴリズムとデータ構造 第2回 線形リスト(復習その2).
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2007/1/11 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
かぞえチャオ!でコードレビュー 2013/10/20 Ciao-ware.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
プログラミング2 関数
PROGRAMMING IN HASKELL
PROGRAMMING IN HASKELL
東京工科大学 コンピュータサイエンス学部 亀田弘之
PROGRAMMING IN HASKELL
プログラミング 4 記憶の割り付け.
プログラミング言語入門.
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
Nakano School of Business 経営情報ビジネス科 【 C言語入門(Test2)】
国立情報学研究所 ソフトウェア研究系 助教授/
オープンソース開発支援のための リビジョン情報と電子メールの検索システム
依存型で型付けされた 副作用のある関数のための 型保存コンパイラ
Talkプログラムのヒント 1 CS-B3 ネットワークプログラミング  &情報科学科実験I.
ATTAPL輪講 (第4回) 続 Dependent Types
ぷよゲーの作り方入門 うでぃおふ 11th サカモトトマト Push key F5 Enter で 次のページへ.
岩村雅一 知能情報工学演習I 第12回(C言語第6回) 岩村雅一
アルゴリズムとデータ構造 2011年7月8日課題の復習
コンパイラ 2011年10月20日
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
2007/6/12(通信コース)2007/6/13(情報コース) 住井
統計ソフトウエアRの基礎.
PROGRAMMING IN HASKELL
プログラミング言語論 第10回 情報工学科 篠埜 功.
~sumii/class/proenb2010/ml2/
形式言語とオートマトン 第14回 プッシュダウンオートマトンと全体のまとめ
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
情報処理Ⅱ 第7回 2004年11月16日(火).
PROGRAMMING IN HASKELL
関数型言語の基礎 型なしl計算 型理論 構成的プログラミング GUIにあらわれる関数概念 PBD VL
18. Case Study : Imperative Objects
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
プログラミング 4 文字列.
PROGRAMMING IN HASKELL
参考:大きい要素の処理.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第七回 知能情報学部 新田直也.
第10回 関数と再帰.
プログラミング基礎a 第3回 C言語によるプログラミング入門 データ入力
計算技術研究会 第5回 C言語勉強会 関数(function)を使う
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
プログラミング言語論 プログラミング言語論 演習7 解答と解説 演習7 解答と解説 1.
岩村雅一 知能情報工学演習I 第7回(後半第1回) 岩村雅一
Presentation transcript:

お仕事にまったく役にたたない内容のコードレビューやりたいと思います。

はじめます。

ちょっと 草植えときますね型言語 Grassコードレビュー 本日の内容 ちょっと 草植えときますね型言語 Grassコードレビュー     _, ._   ( ・ω・) んもー   ○={=}〇,    |:::::::::\, ', ´ 、、、、、し 、、、(((.@)wvwwWWwvwwWwwvwwwwWWW wwWwwWWWWWWwwwwWwwvwWWwWwwvwWWW

でも

今回レビューするコード wWwwwWwwwwwWWWWwvwvwwWWWWwWWWWwwwvwwWWwwWwwvwwWWWwWWWwvwWWwWwvwWWwwwwwWwwvwwWWwWWWwvWwvwwwWWWwwWwwWWWWwvWwwwWWWWwWWWWwwwWwwWWWWWwWWWWWWwvwwWWwWWWwvWwwWWwwwwWWWwwwwwwWWWWWWWWWWwwwwwwwwWwwWWwwwwWWWwwwwwwvwwwWWWwwWwwWWWWwvWwwwwwwWWwwwwWWWwwwwWWWWwWWWWWWWWWWWWWWWWWWWwwwwwWwwWWwWWWwWWWWwvwWWWWWWWWWWWWWWWWWWWWWWWWWWWWWwwwwwwwwwWwwwwwwwwwWwwwwwwWwwwwwwwWwwwwwwwWwwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwwwwwwvwwvWWwWwwWwwwwwwWwwwwwwWwwwwwwwwwWwwwwwwwwwwwwwwwwwwWwwwwwwwwwwwwwwwwwv

本日の内容 昔Grassの処理系を実装したので、その経験を ネタにコードレビューします。 Grassの言語仕様の解説もします。 ラムダ計算とかもさわりだけ解説します。 知らない人向けです。 アリエルには詳しい人がいっぱいいそうなので、 おかしな箇所は突っ込みお願いします。

ちょっと草(略)Grassとは ID:UenoB作 型無しラムダ計算ベースの関数型言語 形式的定義 使用する文字はwWvの三文字だけ それ以外の文字は全てコメント扱い。 だから↓こんなのも立派なソースコード            _, ._           (・ω・ )           ○={=}〇,           |:::::::::\, ', ´ wvwwWW、、、、、、 し 、、、(((.@)wvwwWWwvwwWwwvwwwwWWwwWwwWWWWWWwwwwWwwvwWw

ラムダ計算って何? ググれカス

でも手元にパソコンが無いので λf x.f x

ラムダ計算のなげやりな概要 アロンゾ・チャーチとスティーヴン・コール・ク リーネって人が考案 関数の定義と実行を抽象化した計算体系 LispとかHaskellとか関数型言語の基盤理論 要約すると「全てのもの(データも)は関数」 チューリングマシンが「全てのもの(関数も)は データ」なのでその対極っぽいもの

ラムダ計算の例 ■チャーチ数 ZERO := λf x. x ONE := λf x. f x TWO := λf x. f (f x)‏ THREE := λf x. f (f (f x))‏ #「数」とは関数fを何回xに適用するかと定義 # f = (x + 1), x = 0 でもとの数字に ■チャーチ真理値 TRUE := λx y. x FALSE := λx y. y # XとYを受けとって必ずXを返すのがTRUE、 Yを返すのがFALSE

Grassの文法 使う文字はW,w,vだけ。 他はの文字は無視。関数定義より前も無視。 操作は関数定義と関数適用の2つだけ wから始まるのが関数定義 Wから始まるのが関数適用 関数定義や関数適用はvで区切る 関数適用が連続する場合はvが省略可能

Grassの操作 ■関数適用 App(n, m)‏ ・WWwwwみたいなの ・Wの数(n)は関数の位置 ・wの数(m)は引数の位置 ■関数適用 Abs(n, C)‏ ・wWWWwwWWwwみたいなの ・最初のwの数(n)が引数の数 ・その後ろ関数のBodyで0個以上の関数適用

Grassの状態 Grassの状態は(C,E,D)で表わされる C = コード E = 環境(スタック) D = リターン先を記憶 Grassの初期状態(C0,E0,D0) C0 = 実行しようとするプログラム E0 = プリミティブ D0 = (App(1,1)::ε,ε)::(ε,ε)::ε

プリミティブ E0 = Out :: Succ :: w :: In :: ε ・w 文字"w"(コード119). 関数として使うと自身と引数をeq ・Out 文字を表示する関数. ・In 文字を入力する関数. ・Succ 次の文字を返す関数.ただし255の次は0.

Grassの処理ルール (App(m, n) :: C, E, D) → (Cm, (Cn, En) :: Em, (C, E) :: D) where E = (C1, E1) :: (C2, E2) :: … :: (Ci, Ei) :: E' (i = m, n)‏ (Abs(n, C') :: C, E, D) → (C, (C', E) :: E, D) if n = 1 (Abs(n, C') :: C, E, D) → (C, (Abs(n - 1, C')::ε, E) :: E, D) if n > 1 (ε, f :: E, (C', E') :: D) → (C', f :: E', D)‏ イミフwww

ルール1:コードの先頭が関数定義で、引数が1つ 処理1:コードの先頭からAbs(1, C')を取り除く 処理2:(C', E) を E にpush => クロージャを作成して環境にpush

ルール2:コードの先頭が関数定義で、引数が2つ以上 処理1:コードの先頭からAbs(n, C')を取り除く 処理2:(Abs(n - 1, C')::ε, E)を E にpush => 「引数の数を一つ減らした関数定義」をBodyに持つクロージャを作成して環境にpush (カリー化)‏

ルール3:コードの先頭が関数適用 処理1:コードの先頭からApp(m, n)を取り除く 処理2:Dに(C, E)をpush 処理3:Eの先頭からm番目(Cm, Em)を参照 処理4:CをCmに置き換える 処理5:Eを(Cn, En)::Emに置き換える => Dに現在の状態(リターン先)を記録しておく => コードを 実行する関数のBody に 環境を 引数::関数定義時の環境 に置き換える

ルール4:コードが空になる 処理1:Dの先頭から(C', E')を取り出す 処理2:CをC'に置き換える 処理3:Eの先頭からfを取り出す 処理4:Eをf::E'に置き換える => コードが空になったのでリターン処理をする # Dの先頭(C',E') は 関数を実行した時の状態 # f は戻り値。戻り先のスタックにpush

れっつりーでぃんぐ