世界のナベアツに Gauche で挑戦する 日本野望の会  総裁 吉田 茂   a.k.a.   yshigeru
アナタは誰ですか? <ul><li>姓は「吉田」、名は「茂」 </li></ul><ul><li>またの名を yshigeru </li></ul><ul><li>日本野望の会総裁 </li></ul><ul><li>シルクハッター </li>...
言っておきますが… Q.  ご本人ですか ? A.  違います
言っておきますが… Q.  若き日の思い出 ? A.  違います
言っておきますが… Q.  ご親戚の方ですか ? A.  違います
吉田茂 でございます。
さて、
本日の野望 VS 世界のナベアツ氏 世界のナベアツに Gauche で挑戦したい !!
ナベアツ問題   1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになるプログラムを作成せよ。 問題: FizzBuzz 問題はもう古い!
((((1 から  40) ' まで数えて  3  の倍数  ' と  3  がつく数字  ' の時だけ ) ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 ((((...
(( ( (1 から   40)  ' まで数えて  3  の倍数  ' と  3  がつく数字  ' の時だけ ) ' アホに )  ' なります ) 分析 1から40まで数えて、3の倍数と3がつく数字のときだけアホになります。 ((((((...
((((1 から  40)   ' まで数えて  3  の倍数  ' と  3  がつく数字  ' の時だけ ) ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 ((...
((((1 から  40) ' まで数えて  3  の倍数  ' と  3  がつく数字  ' の時だけ )  ' アホに ) ' なります ) 分析 1 から 40 まで数えて、 3 の倍数と 3 がつく数字のときだけアホになります。 (((...
ソースコード <ul><li>(define (1 から  n) </li></ul><ul><li>(let ((numbers (iota n 1)) </li></ul><ul><li>(preds '()) </li></ul><ul>...
ソースコード <ul><li>(define ( の倍数  x) </li></ul><ul><li>(lambda (n) </li></ul><ul><li>(= (remainder n x) 0))) </li></ul><ul><li...
ソースコード <ul><li>(define ( アホに  str) </li></ul><ul><li>(let ((chars (string->list str))) </li></ul><ul><li>(list->string (ap...
ソースコード <ul><li>(define ( なります  numbers preds actions) </li></ul><ul><li>(define (apply-action n preds actions result appli...
ソースコード <ul><li>(define ( 読み  n) </li></ul><ul><li>(let (( 数  '(&quot;&quot; &quot; いち &quot; &quot; に &quot; &quot; さん &qu...
実演
次回はあらびき団で お会いしましょう! ご清聴ありがとうございました
Upcoming SlideShare
Loading in …5
×

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

2,344 views

Published on

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

No Downloads
Views
Total views
2,344
On SlideShare
0
From Embeds
0
Number of Embeds
29
Actions
Shares
0
Downloads
4
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

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

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

×