lisp code batton - shibuya.lisp tech talk #5

46
Lisp コードバトン Higepon Shibuya.Lisp Tech Talk#5 March 22, 2010

Upload: higepon-taro-minowa

Post on 29-Jun-2015

1.429 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Lisp code batton - Shibuya.lisp Tech Talk #5

Lisp コードバトンHigepon

Shibuya.Lisp Tech Talk#5March 22, 2010

Page 2: Lisp code batton - Shibuya.lisp Tech Talk #5

質問

Page 3: Lisp code batton - Shibuya.lisp Tech Talk #5

背景•shibuya.lisp 楽しかったなあ

•その後 Lisp のコード書いていない

•どこから始めたら良いか分からない

•括弧こわい><

• Lisp 書き始めるきっかけがない

Page 4: Lisp code batton - Shibuya.lisp Tech Talk #5

コードバトン

•コードをバトンにしてみんなでまわす

•好きなように改善

•一から作らなくて良いので触りやすい

•他人のコードは勉強になる

Page 5: Lisp code batton - Shibuya.lisp Tech Talk #5

バトンの仕組み•gist.github.com を使う

•バトン URL 受け取る

• fork

•自分のコードを貼る

•次の人に URL 教える

Page 6: Lisp code batton - Shibuya.lisp Tech Talk #5

2つのルール

•「他人にやさしい」変更をして2日以内にまわす

•次の人を見守る

Page 7: Lisp code batton - Shibuya.lisp Tech Talk #5

Schemeコードバトン

Page 8: Lisp code batton - Shibuya.lisp Tech Talk #5

数字

Page 9: Lisp code batton - Shibuya.lisp Tech Talk #5

17人68行→583行

Page 10: Lisp code batton - Shibuya.lisp Tech Talk #5

0

200

400

600

800

yad-EL gara yshigeru g1 masa_edw leque emasaka 武蔵 naoya_t snmsts scinfaxi Gemma torus (び) nobsun koguro

Page 11: Lisp code batton - Shibuya.lisp Tech Talk #5

コード紹介

Page 12: Lisp code batton - Shibuya.lisp Tech Talk #5

higepon スタート

•英単語学習スクリプト

•Pure R6RS Scheme

•辞書ファイル : S式を read

•入力受付 : (read (current-input-port))

•成績記録 : S式を write

•match : 問題と答えのパース

•call/cc : 途中でやめたいとき

Page 13: Lisp code batton - Shibuya.lisp Tech Talk #5

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*)))))

Page 14: Lisp code batton - Shibuya.lisp Tech Talk #5

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

Page 15: Lisp code batton - Shibuya.lisp Tech Talk #5

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

問題だす

Page 16: Lisp code batton - Shibuya.lisp Tech Talk #5

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

問題だす

正解・不正解記録

Page 17: Lisp code batton - Shibuya.lisp Tech Talk #5

バトンは進む

Page 18: Lisp code batton - Shibuya.lisp Tech Talk #5

yad-EL ++18 --22

•Mosh -> Gauche ><。

•import -> use

•port flush 意識

•SRFI-1 使わない

•first -> car, second -> cadr•Gauche は main が自動で呼ばれる

•SRFI-22

Page 19: Lisp code batton - Shibuya.lisp Tech Talk #5

garaemon ++131 --24

•Mosh に戻る

•Common Lisper

•躊躇なくマクロ

•すぐREPL

•コマンドラインオプションの追加

•SRFI 37•mosh scheme_button.scm -h : ヘルプ

Page 20: Lisp code batton - Shibuya.lisp Tech Talk #5

yshigeru

•これくらい小さな変更でも参加できるYo!

Page 21: Lisp code batton - Shibuya.lisp Tech Talk #5

g000001 ++17 --18

•わざと入れてあった call/cc をあっさり削除

•named let loop から脱出するには loop を呼ばなければ良い

Page 22: Lisp code batton - Shibuya.lisp Tech Talk #5

g000001 ++17 --18

•わざと入れてあった call/cc をあっさり削除

•named let loop から脱出するには loop を呼ばなければ良い

•コード書けないというのは嘘だ!

Page 23: Lisp code batton - Shibuya.lisp Tech Talk #5

masa_edw ++89 --36

•Scheme の外へ : FFI で端末制御

•UI(操作感)に切り込んだ

Page 24: Lisp code batton - Shibuya.lisp Tech Talk #5

leque ++288 --142

•そろそろコードがやばい事に気付いた人

•Unit Test / Refactoring•SRFI-78 lightweight-testing•アクセサ定義

•Extract methods

•マクロできれいきれい

Page 25: Lisp code batton - Shibuya.lisp Tech Talk #5

leque 続き

•with-curses

•begin0

Page 26: Lisp code batton - Shibuya.lisp Tech Talk #5

emasaka ++63 --13

•逆引き

•意味が出て単語を答える

•なぜ今までなかった?

•問題でタイムアウト機能

•with-curses をマクロに

•body を直接書ける

Page 27: Lisp code batton - Shibuya.lisp Tech Talk #5

kaz634 ++42 --20

•ツールの目的を理解して改善

•アルゴリズムの変更

•誤り回数順の出題 → 最近間違えた単語を考慮

•日付・時刻を扱う

•SRFI-19

Page 28: Lisp code batton - Shibuya.lisp Tech Talk #5

naoya_t ++210 --69

•Mosh、Gauche の両方で動くように

•Gauche + cwrapper で端末制御

•SRFI-0 cond-expand : 処理系依存を切り分け

•(cond-expand (mosh ;; mosh 固有 ....) (gauche ;; gauche 固有 ...))

Page 29: Lisp code batton - Shibuya.lisp Tech Talk #5

snmsts ++21 --12

•Common Lisper

•Windows 対応

•FFI は pdcurses.dll

•(host-os) で処理分岐

•大人の事情発見

Page 30: Lisp code batton - Shibuya.lisp Tech Talk #5

scinfaxi ++106 --15

•--color, --mad モード

•SRFI使いこなし

•SRFI-27 ランダム

•SRFI-42 内包表記

•SRFI-26 cut

•eval, 伝統的マクロ登場

Page 31: Lisp code batton - Shibuya.lisp Tech Talk #5

scinfaxi ++106 --15

•--color, --mad モード

•SRFI使いこなし

•SRFI-27 ランダム

•SRFI-42 内包表記

•SRFI-26 cut

•eval, 伝統的マクロ登場

Page 32: Lisp code batton - Shibuya.lisp Tech Talk #5

Gemma ++171 --70

•CGI になった

Page 33: Lisp code batton - Shibuya.lisp Tech Talk #5

Gemma 続き

•Gauche で CGI : (use www.cgi)

•sxml->xml で出力

•query parameter で分岐

•and-let*

Page 34: Lisp code batton - Shibuya.lisp Tech Talk #5

torus ++28 --15

•query parameter で辞書ファイル指定

•gauche.parameter

•parameterize で辞書ファイルをパラメータ化

Page 35: Lisp code batton - Shibuya.lisp Tech Talk #5

nobsun ++91 --4

•shell からも対話型で使えるように

•let/cc•(let/cc var body …) =>

•(call/cc (lambda (var) body …))

•inc!•(inc! a) => (set! a (+ a 1))

Page 36: Lisp code batton - Shibuya.lisp Tech Talk #5

アンカー

Page 37: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•変態

Page 38: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

Page 39: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

Page 40: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

•シンセサイザ内蔵

Page 41: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

•シンセサイザ内蔵

•wav データ動的に生成してる

Page 42: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

•シンセサイザ内蔵

•wav データ動的に生成してる

•MML -> wav

Page 43: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

•シンセサイザ内蔵

•wav データ動的に生成してる

•MML -> wav

•死ぬ程勉強になるので読むべき

Page 44: Lisp code batton - Shibuya.lisp Tech Talk #5

koguro ++557 --208

•Web サーバ自前で書いてある

•シンセサイザ内蔵

•wav データ動的に生成してる

•MML -> wav

•死ぬ程勉強になるので読むべき

•Schemeプログラマすごい!

Page 45: Lisp code batton - Shibuya.lisp Tech Talk #5

Scheme以外のコードバトン

•Nu •http://github.com/yuumi3/sheme_baton

•Smalltalk by shortsleeved

•Clojure •athos -> 深町 ->穂苅 -> manjilab -> deltam -> omasanori -> naotoakiyama

•smart.fm からデータ取得、音声再生、GUI

Page 46: Lisp code batton - Shibuya.lisp Tech Talk #5

Common Lispコードバトン