Your SlideShare is downloading. ×

世界のナベアツにGaucheで挑戦する

2,117

Published on

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,117
On Slideshare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
2
Comments
0
Likes
1
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 世界のナベアツに Gauche で挑戦する 日本野望の会 総裁 吉田 茂 a.k.a. yshigeru
  • 2. アナタは誰ですか?
    • 姓は「吉田」、名は「茂」
    • またの名を yshigeru
    • 日本野望の会総裁
    • シルクハッター
    • 好きな Lisp:Scheme
    • 好きな処理系 :Gauche ( ver. 0.5 くらいから使ってます)
    • Lisp 以外の関心事: ACE 、 TAO 、 OpenDDS
    • やんごとなき事情により目下ニート生活中
  • 3. 言っておきますが… Q. ご本人ですか ? A. 違います
  • 4. 言っておきますが… Q. 若き日の思い出 ? A. 違います
  • 5. 言っておきますが… Q. ご親戚の方ですか ? A. 違います
  • 6. 吉田茂 でございます。
  • 7. さて、
  • 8. 本日の野望 VS 世界のナベアツ氏 世界のナベアツに Gauche で挑戦したい !!
  • 9. ナベアツ問題   1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになるプログラムを作成せよ。 問題: FizzBuzz 問題はもう古い!
  • 10. ((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 ((((((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なって 5 の倍数 ' の時だけ ) ' 犬っぽく ) ' なって 8 の倍数 ' の時だけ ) ' 気持ちよく ) ' なります ) 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになって、 5 の倍数のときだけ犬っぽくなって、 8 の倍数のときだけ気持ちよくなります。
  • 11. (( ( (1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なります ) 分析 1から40まで数えて、3の倍数と3がつく数字のときだけアホになります。 ((((((( (1 から 40) 'まで数えて 3 の倍数 'と 3 がつく数字 'の時だけ) 'アホに) 'なって 5 の倍数 'の時だけ) '犬っぽく) 'なって 8 の倍数 'の時だけ) '気持ちよく) ' なります ) 1から40まで数えて、3の倍数と3がつく数字のときだけアホになって、5の倍数のときだけ犬っぽくなって、8の倍数のときだけ気持ちよくなります。 最初は (1 から n) 出だしは「 (1 から n) 」 最後は「 ' なります」 最後は「 ' なります」
  • 12. ((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 ((((((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なって 5 の倍数 ' の時だけ ) ' 犬っぽく ) ' なって 8 の倍数 ' の時だけ ) ' 気持ちよく ) ' なります ) 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになって、 5 の倍数のときだけ犬っぽくなって、 8 の倍数のときだけ気持ちよくなります。 「 ' まで数えて」、「 ' なって」の後は条件 「 ' まで数えて」、「 ' なって」の後は条件 条件は「と」でつながることもある
  • 13. ((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 ((((((((1 から 40) ' まで数えて 3 の倍数 ' と 3 がつく数字 ' の時だけ ) ' アホに ) ' なって 5 の倍数 ' の時だけ ) ' 犬っぽく ) ' なって 8 の倍数 ' の時だけ ) ' 気持ちよく ) ' なります ) 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになって、 5 の倍数のときだけ犬っぽくなって、 8 の倍数のときだけ気持ちよくなります。 条件の後は、動作を表す 「 ' アホに」、「 ' 犬っぽく」、「 ' 気持ちよく」 条件の後は、動作を表す 「 ' アホに」、「 ' 犬っぽく」、「 ' 気持ちよく」
  • 14. ソースコード
    • (define (1 から n)
    • (let ((numbers (iota n 1))
    • (preds '())
    • (actions '()))
    • (define (dispatch msg . args)
    • (case msg
    • (( まで数えて なって ) (push! preds (apply まで数えて args)))
    • (( アホに ) (push! actions アホに ))
    • (( 犬っぽく ) (push! actions 犬っぽく ))
    • (( 気持ちよく ) (push! actions 気持ちよく ))
    • (( なります ) ( なります numbers (reverse preds) (reverse actions))))
    • dispatch)
    • dispatch))
    ナベアツ関数発動!! 条件を生成 して登録 動作を登録
  • 15. ソースコード
    • (define ( の倍数 x)
    • (lambda (n)
    • (= (remainder n x) 0)))
    • (define ( がつく数字 x)
    • (let ((test (string->regexp (number->string x))))
    • (lambda (n)
    • (test (number->string n)))))
    • (define ( と func1 func2)
    • (lambda (n)
    • (or (func1 n) (func2 n))))
    • (define ( まで数えて n func adj . rest)
    • (if (eq? adj ' の時だけ )
    • (func n)
    • ( と (func n) ( まで数えて (list-ref rest 0)
    • (list-ref rest 1)
    • (list-ref rest 2)
    • (list-tail rest 3)))))
    条件関数 条件の連結 条件の生成
  • 16. ソースコード
    • (define ( アホに str)
    • (let ((chars (string->list str)))
    • (list->string (append (list (car chars) # 〜 ) (cdr chars)))))
    • (define ( 犬っぽく str)
    • (string-append str " バフッ "))
    • (define ( 気持ちよく str)
    • (cond ((#/ な $/ str) (string-append str " ぁ〜〜ッ "))
    • ((#/[ ちに ]$/ str) (string-append str " ぃ〜〜ッ "))
    • ((#/[ くうッ ]$/ str) (string-append str " ぅ〜〜ッ "))
    • ((#/ ご $/ str) (string-append str " ぉ〜〜ッ "))
    • (else (string-append str " 〜〜ッ "))))
    動作を表す関数 アホになったり、犬っぽくなったり、気持ちよくなったり 文字列の変換を行う。
  • 17. ソースコード
    • (define ( なります numbers preds actions)
    • (define (apply-action n preds actions result applied?)
    • (cond ((null? preds) (values result applied?))
    • (((car preds) n)
    • (apply-action n (cdr preds) (cdr actions) ((car actions) result) #t))
    • (else
    • (apply-action n (cdr preds) (cdr actions) result applied?))))
    • (for-each (lambda (n)
    • (call-with-values (lambda ()
    • (apply-action n preds actions ( 読み n) #f))
    • (lambda (result applied?)
    • (print (if applied? result (number->string n))))))
    • numbers))
    ナベアツ関数の本丸 数列に条件関数を適用し、真ならば、動作関数を適用する
  • 18. ソースコード
    • (define ( 読み n)
    • (let (( 数 '("" " いち " " に " " さん " " よん " " ご " " ろく " " なな " " はち " " きゅう "))
    • ( 桁 '("" " じゅう " " ひゃく " " せん ")))
    • (let loop ((digits (map digit->integer (string->list (number->string n)))))
    • (if (null? digits)
    • ""
    • (string-append (if (and (= (car digits) 1)
    • (> (length digits) 1))
    • ""
    • (list-ref 数 (car digits)))
    • (list-ref 桁 (- (length digits) 1))
    • (loop (cdr digits)))))))
    数をひらがな表記に変換する
  • 19. 実演
  • 20. 次回はあらびき団で お会いしましょう! ご清聴ありがとうございました

×