lisp code batton - shibuya.lisp tech talk #5
TRANSCRIPT
Lisp コードバトンHigepon
Shibuya.Lisp Tech Talk#5March 22, 2010
質問
背景•shibuya.lisp 楽しかったなあ
•その後 Lisp のコード書いていない
•どこから始めたら良いか分からない
•括弧こわい><
• Lisp 書き始めるきっかけがない
コードバトン
•コードをバトンにしてみんなでまわす
•好きなように改善
•一から作らなくて良いので触りやすい
•他人のコードは勉強になる
バトンの仕組み•gist.github.com を使う
•バトン URL 受け取る
• fork
•自分のコードを貼る
•次の人に URL 教える
2つのルール
•「他人にやさしい」変更をして2日以内にまわす
•次の人を見守る
Schemeコードバトン
数字
17人68行→583行
0
200
400
600
800
yad-EL gara yshigeru g1 masa_edw leque emasaka 武蔵 naoya_t snmsts scinfaxi Gemma torus (び) nobsun koguro
コード紹介
higepon スタート
•英単語学習スクリプト
•Pure R6RS Scheme
•辞書ファイル : S式を read
•入力受付 : (read (current-input-port))
•成績記録 : S式を write
•match : 問題と答えのパース
•call/cc : 途中でやめたいとき
higepon(define (main args) (let1 result* (call/cc (lambda (break) (let loop ([word-spec* (sort-word-spec* (file->sexp-list (second args)))] [result-spec* '()]) (match word-spec* [() result-spec*] [((word meaning ok-count ng-count) . more) (format #t "~s: " word) ;; Ctrl-D 待ち (read (current-input-port)) ;; 答え表示 (format #t "~s y/n? " meaning) (case (read-char (current-input-port)) ;; Y だったら [(#\y #\Y) (loop more (cons (list word meaning (+ ok-count 1) ng-count) result-spec* ))] ;; N だったら [(#\N #\n) (loop more (cons (list word meaning ok-count (+ ng-count 1)) result-spec*))] ;; Q だったら途中でやめるので成績を記録 [(#\q #\Q) (break (append (reverse result-spec*) word-spec*))])])])) ;; 正答と誤答を記録 (call-with-port (open-file-output-port (second args) (make-file-options '(no-fail)) 'block (native-transcoder)) (lambda (p) (for-each (lambda (x) (write x p) (newline p)) result*)))))
higepon(define (main args) (let1 result* (call/cc (lambda (break) (let loop ([word-spec* (sort-word-spec* (file->sexp-list (second args)))] [result-spec* '()]) (match word-spec* [() result-spec*] [((word meaning ok-count ng-count) . more) (format #t "~s: " word) ;; Ctrl-D 待ち (read (current-input-port)) ;; 答え表示 (format #t "~s y/n? " meaning) (case (read-char (current-input-port)) ;; Y だったら [(#\y #\Y) (loop more (cons (list word meaning (+ ok-count 1) ng-count) result-spec* ))] ;; N だったら [(#\N #\n) (loop more (cons (list word meaning ok-count (+ ng-count 1)) result-spec*))] ;; Q だったら途中でやめるので成績を記録 [(#\q #\Q) (break (append (reverse result-spec*) word-spec*))])])])) ;; 正答と誤答を記録 (call-with-port (open-file-output-port (second args) (make-file-options '(no-fail)) 'block (native-transcoder)) (lambda (p) (for-each (lambda (x) (write x p) (newline p)) result*)))))
単語のリストを read
higepon(define (main args) (let1 result* (call/cc (lambda (break) (let loop ([word-spec* (sort-word-spec* (file->sexp-list (second args)))] [result-spec* '()]) (match word-spec* [() result-spec*] [((word meaning ok-count ng-count) . more) (format #t "~s: " word) ;; Ctrl-D 待ち (read (current-input-port)) ;; 答え表示 (format #t "~s y/n? " meaning) (case (read-char (current-input-port)) ;; Y だったら [(#\y #\Y) (loop more (cons (list word meaning (+ ok-count 1) ng-count) result-spec* ))] ;; N だったら [(#\N #\n) (loop more (cons (list word meaning ok-count (+ ng-count 1)) result-spec*))] ;; Q だったら途中でやめるので成績を記録 [(#\q #\Q) (break (append (reverse result-spec*) word-spec*))])])])) ;; 正答と誤答を記録 (call-with-port (open-file-output-port (second args) (make-file-options '(no-fail)) 'block (native-transcoder)) (lambda (p) (for-each (lambda (x) (write x p) (newline p)) result*)))))
単語のリストを read
問題だす
higepon(define (main args) (let1 result* (call/cc (lambda (break) (let loop ([word-spec* (sort-word-spec* (file->sexp-list (second args)))] [result-spec* '()]) (match word-spec* [() result-spec*] [((word meaning ok-count ng-count) . more) (format #t "~s: " word) ;; Ctrl-D 待ち (read (current-input-port)) ;; 答え表示 (format #t "~s y/n? " meaning) (case (read-char (current-input-port)) ;; Y だったら [(#\y #\Y) (loop more (cons (list word meaning (+ ok-count 1) ng-count) result-spec* ))] ;; N だったら [(#\N #\n) (loop more (cons (list word meaning ok-count (+ ng-count 1)) result-spec*))] ;; Q だったら途中でやめるので成績を記録 [(#\q #\Q) (break (append (reverse result-spec*) word-spec*))])])])) ;; 正答と誤答を記録 (call-with-port (open-file-output-port (second args) (make-file-options '(no-fail)) 'block (native-transcoder)) (lambda (p) (for-each (lambda (x) (write x p) (newline p)) result*)))))
単語のリストを read
問題だす
正解・不正解記録
バトンは進む
yad-EL ++18 --22
•Mosh -> Gauche ><。
•import -> use
•port flush 意識
•SRFI-1 使わない
•first -> car, second -> cadr•Gauche は main が自動で呼ばれる
•SRFI-22
garaemon ++131 --24
•Mosh に戻る
•Common Lisper
•躊躇なくマクロ
•すぐREPL
•コマンドラインオプションの追加
•SRFI 37•mosh scheme_button.scm -h : ヘルプ
yshigeru
•これくらい小さな変更でも参加できるYo!
g000001 ++17 --18
•わざと入れてあった call/cc をあっさり削除
•named let loop から脱出するには loop を呼ばなければ良い
g000001 ++17 --18
•わざと入れてあった call/cc をあっさり削除
•named let loop から脱出するには loop を呼ばなければ良い
•コード書けないというのは嘘だ!
masa_edw ++89 --36
•Scheme の外へ : FFI で端末制御
•UI(操作感)に切り込んだ
leque ++288 --142
•そろそろコードがやばい事に気付いた人
•Unit Test / Refactoring•SRFI-78 lightweight-testing•アクセサ定義
•Extract methods
•マクロできれいきれい
leque 続き
•with-curses
•begin0
emasaka ++63 --13
•逆引き
•意味が出て単語を答える
•なぜ今までなかった?
•問題でタイムアウト機能
•with-curses をマクロに
•body を直接書ける
kaz634 ++42 --20
•ツールの目的を理解して改善
•アルゴリズムの変更
•誤り回数順の出題 → 最近間違えた単語を考慮
•日付・時刻を扱う
•SRFI-19
naoya_t ++210 --69
•Mosh、Gauche の両方で動くように
•Gauche + cwrapper で端末制御
•SRFI-0 cond-expand : 処理系依存を切り分け
•(cond-expand (mosh ;; mosh 固有 ....) (gauche ;; gauche 固有 ...))
snmsts ++21 --12
•Common Lisper
•Windows 対応
•FFI は pdcurses.dll
•(host-os) で処理分岐
•大人の事情発見
scinfaxi ++106 --15
•--color, --mad モード
•SRFI使いこなし
•SRFI-27 ランダム
•SRFI-42 内包表記
•SRFI-26 cut
•eval, 伝統的マクロ登場
scinfaxi ++106 --15
•--color, --mad モード
•SRFI使いこなし
•SRFI-27 ランダム
•SRFI-42 内包表記
•SRFI-26 cut
•eval, 伝統的マクロ登場
Gemma ++171 --70
•CGI になった
Gemma 続き
•Gauche で CGI : (use www.cgi)
•sxml->xml で出力
•query parameter で分岐
•and-let*
torus ++28 --15
•query parameter で辞書ファイル指定
•gauche.parameter
•parameterize で辞書ファイルをパラメータ化
nobsun ++91 --4
•shell からも対話型で使えるように
•let/cc•(let/cc var body …) =>
•(call/cc (lambda (var) body …))
•inc!•(inc! a) => (set! a (+ a 1))
アンカー
koguro ++557 --208
•変態
koguro ++557 --208
koguro ++557 --208
•Web サーバ自前で書いてある
koguro ++557 --208
•Web サーバ自前で書いてある
•シンセサイザ内蔵
koguro ++557 --208
•Web サーバ自前で書いてある
•シンセサイザ内蔵
•wav データ動的に生成してる
koguro ++557 --208
•Web サーバ自前で書いてある
•シンセサイザ内蔵
•wav データ動的に生成してる
•MML -> wav
koguro ++557 --208
•Web サーバ自前で書いてある
•シンセサイザ内蔵
•wav データ動的に生成してる
•MML -> wav
•死ぬ程勉強になるので読むべき
koguro ++557 --208
•Web サーバ自前で書いてある
•シンセサイザ内蔵
•wav データ動的に生成してる
•MML -> wav
•死ぬ程勉強になるので読むべき
•Schemeプログラマすごい!
Scheme以外のコードバトン
•Nu •http://github.com/yuumi3/sheme_baton
•Smalltalk by shortsleeved
•Clojure •athos -> 深町 ->穂苅 -> manjilab -> deltam -> omasanori -> naotoakiyama
•smart.fm からデータ取得、音声再生、GUI
Common Lispコードバトン