..                     M 式で生活してみる                       小宮山 敦史                         KITCC    小宮山 敦史 (KITCC)     M 式で生活し...
自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA      C で書いた Lisp インタプリタ      LOL 参考にして C で書いた forth インタプリタ...
自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA      C で書いた Lisp インタプリタ      LOL 参考にして C で書いた forth インタプリタ...
M式     Lisp といえば S 式     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))     S 式はかっこが多くて読みにくい1 1     当部比    ...
M式     Lisp といえば S 式     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))     S 式はかっこが多くて読みにくい1     かっこが少ない書き...
M式     Lisp といえば S 式     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))     S 式はかっこが多くて読みにくい1     かっこが少ない書き...
M式     Lisp といえば S 式     (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1))))))     S 式はかっこが多くて読みにくい1     かっこが少ない書き...
M 式 READER  今の Lisp 処理系は大抵 S 式しか受け付けない……  小宮山 敦史 (KITCC)   M 式で生活してみる    4/8
M 式 READER  今の Lisp 処理系は大抵 S 式しか受け付けない……  M 式で入力できる処理系作るか……?  小宮山 敦史 (KITCC)   M 式で生活してみる    4/8
M 式 READER  今の Lisp 処理系は大抵 S 式しか受け付けない……  M 式で入力できる処理系作るか……?  と思ったが探したらあった       http:       //www.informatimago.com/devel...
M 式 READER  今の Lisp 処理系は大抵 S 式しか受け付けない……  M 式で入力できる処理系作るか……?  と思ったが探したらあった       http:       //www.informatimago.com/devel...
M 式 WRITER  人からもらったソースがもし S 式だったら!                       ?   (defun parse-m-term (parser)     (cond       ((token-p :m-ope...
M 式 WRITER  人からもらったソースがもし S 式だったら!                       ?   (defun parse-m-term (parser)     (cond       ((token-p :m-ope...
M 式 WRITER  人からもらったソースがもし S 式だったら!                       ?   (defun parse-m-term (parser)     (cond       ((token-p :m-ope...
S 式->M 式コンバータ.s2m[sexp] = [stringp[sexp]->format[nil;""~A"";sexp];              atom[sexp]->format[nil;"~(~A~)";sexp];    ...
S 式->M 式コンバータ.(defun s2m (sexp)  (cond ((stringp sexp) (format nil ""~A"" sexp))        ((atom sexp) (format nil "~(~A~)" ...
まとめ S 式よりかっこが少ない M 式 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った 小宮山 敦史 (KITCC)   M 式で生活してみる   8/8
まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った これで S 式を覚えなくても Lisp が書けるね (笑) 小宮山 敦史 (KITCC)   M 式...
Upcoming SlideShare
Loading in …5
×

M-expr

3,494 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,494
On SlideShare
0
From Embeds
0
Number of Embeds
2,323
Actions
Shares
0
Downloads
3
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

M-expr

  1. 1. .. M 式で生活してみる 小宮山 敦史 KITCC 小宮山 敦史 (KITCC) M 式で生活してみる 1/8
  2. 2. 自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA C で書いた Lisp インタプリタ LOL 参考にして C で書いた forth インタプリタ 小宮山 敦史 (KITCC) M 式で生活してみる 2/8
  3. 3. 自己紹介 小宮山敦史 京都の大学院 2 回生 twitter:komiyamb github:Atsushi-KOMIYAMA C で書いた Lisp インタプリタ LOL 参考にして C で書いた forth インタプリタ リリカル Lisp の校正とか Lisp ギャグ Advent Calendar のネタ 1∼2 個 小宮山 敦史 (KITCC) M 式で生活してみる 2/8
  4. 4. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  5. 5. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  6. 6. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい) fact[x] = [x=0 -> 1; T -> x∗fact[x-1]] 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  7. 7. M式 Lisp といえば S 式 (defun fact (x) (cond ((eq x 0) 1) (t (∗ x (fact (- x 1)))))) S 式はかっこが多くて読みにくい1 かっこが少ない書き方があれば…… そこで人間が読みやすい (?)M 式!(S 式は機械が読みやすい) fact[x] = [x=0 -> 1; T -> x∗fact[x-1]] Lisp1.5 のマニュアルには M 式で例が載っている M-expressions S-sxpressions car[x] (CAR X) T (QUOTE T) id[x]=x (DEFUN ID (X) X) 1 当部比 小宮山 敦史 (KITCC) M 式で生活してみる 3/8
  8. 8. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  9. 9. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  10. 10. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? と思ったが探したらあった http: //www.informatimago.com/develop/lisp/com/informatimago/ small-cl-pgms/m-expression/m-expression.lisp CommonLisp で M 式の REPL リードした M 式を S 式に変換して処理系に渡すプログラム やっぱり誰か作ってるよねー 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  11. 11. M 式 READER 今の Lisp 処理系は大抵 S 式しか受け付けない…… M 式で入力できる処理系作るか……? と思ったが探したらあった http: //www.informatimago.com/develop/lisp/com/informatimago/ small-cl-pgms/m-expression/m-expression.lisp CommonLisp で M 式の REPL リードした M 式を S 式に変換して処理系に渡すプログラム やっぱり誰か作ってるよねー コレさえあれば M 式だけで Lisp ができる……? 小宮山 敦史 (KITCC) M 式で生活してみる 4/8
  12. 12. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  13. 13. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... S 式->M 式コンバータがあれば M 式になるので読める! (defun id (x) x) → id[x] = x 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  14. 14. M 式 WRITER 人からもらったソースがもし S 式だったら! ? (defun parse-m-term (parser) (cond ((token-p :m-open parser) (with-parens (paser :m-open :m-close) ‘(cond ,@(parse-m-clauses parser)))) ((token-p :s-open parser) ‘(quote ,(parse-s-expr parser))) ... S 式->M 式コンバータがあれば M 式になるので読める! (defun id (x) x) → id[x] = x 作ってみた 小宮山 敦史 (KITCC) M 式で生活してみる 5/8
  15. 15. S 式->M 式コンバータ.s2m[sexp] = [stringp[sexp]->format[nil;""~A"";sexp]; atom[sexp]->format[nil;"~(~A~)";sexp]; eq[DEFUN;car[sexp]]->format[nil;"~(~A[~A]~) = ~A;"; s2m[cadr[sexp]]; s2m-params[caddr[sexp]]; s2m[cadddr[sexp]]]; eq[SETQ;car[sexp]]->format[nil;"~A := ~A;"; s2m[cadr[sexp]]; s2m[caddr[sexp]]]; eq[LAMBDA;car[sexp]]->format[nil;"λ [~([~A~)]; ~A]"; s2m-params[cadr[sexp]]; s2m[caddr[sexp]]]; eq[COND;car[sexp]]->format[nil;"[~{~A~^;~}]"; mapcar[λ [[x]; format[nil;"~A->~A"; s2m[car[x]]; s2m-params[cdr[x]]]]; cdr[sexp]]]; eq[QUOTE;car[sexp]]->format[nil;"~:@(~A~)"; cadr[sexp]]; t->format[nil;"~(~A~)[~A]"; s2m[car[sexp]]; s2m-params[cdr[sexp]]]];s2m-params[params] = format[nil;"~{~A~^;~}"; mapcar[function[s2m]; params]]; 小宮山 敦史 (KITCC) M 式で生活してみる 6/8
  16. 16. S 式->M 式コンバータ.(defun s2m (sexp) (cond ((stringp sexp) (format nil ""~A"" sexp)) ((atom sexp) (format nil "~(~A~)" sexp)) ((eq ’defun (car sexp)) (format nil "~(~A[~A]~) = ~A;" (s2m (cadr sexp)) (s2m-params (caddr sexp)) (s2m (cadddr sexp)))) ((eq ’setq (car sexp)) (format nil "~A := ~A;" (s2m (cadr sexp)) (s2m (caddr sexp)))) ((eq ’lambda (car sexp)) (format nil "λ [~([~A~)]; ~A]" (s2m-params (cadr sexp)) (s2m (caddr sexp)))) ((eq ’cond (car sexp)) (format nil "[~{~A~^;~}]" (mapcar (lambda (x) (format nil "~A->~A" (s2m (car x)) (s2m-params (cdr x)))) (cdr sexp)))) ((eq ’quote (car sexp)) (format nil "~:@(~A~)" (cadr sexp))) (t (format nil "~(~A~)[~A]" (s2m (car sexp)) (s2m-params (cdr sexp)))))) (defun s2m-params (params) (format nil "~{~A~^;~}" (mapcar #’s2m params))) 小宮山 敦史 (KITCC) M 式で生活してみる 7/8
  17. 17. まとめ S 式よりかっこが少ない M 式 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  18. 18. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  19. 19. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った 小宮山 敦史 (KITCC) M 式で生活してみる 8/8
  20. 20. まとめ S 式よりかっこが少ない M 式 M 式を CommonLisp で読むプログラムの紹介 S 式を M 式に変換するプログラムを作った これで S 式を覚えなくても Lisp が書けるね (笑) 小宮山 敦史 (KITCC) M 式で生活してみる 8/8

×