Lisp tutorial for Pythonista : Day 1

2,115 views

Published on

Published in: Technology
1 Comment
5 Likes
Statistics
Notes
  • 実用言語という側面でやってるので、Lisper的には「ダサイ」コーディングとか「それ違うだろ!」とか色々出てきます。基本的に「普通な感じに使える速いPython」としてLispを見てて、深いところには興味ないので、そこんとこよろしく。
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
2,115
On SlideShare
0
From Embeds
0
Number of Embeds
5
Actions
Shares
0
Downloads
0
Comments
1
Likes
5
Embeds 0
No embeds

No notes for slide

Lisp tutorial for Pythonista : Day 1

  1. 1. Lisp tutorial for Pythonista.Day #1 : Gentlemen, Start your engine. Ransui Iso Strategic Technology Group, X-Listing Co, Ltd.
  2. 2. これから Lisp の話をします
  3. 3. Lisp の歴史とか概要
  4. 4. Wikipedia でも読んどいて下さい
  5. 5. それでも覚えておきたい Lisp の神々のお姿
  6. 6. John McCarthy
  7. 7. Richard M. Stallman
  8. 8. Guy L Steel Jr.
  9. 9. Paul Graham
  10. 10. その他にも神はいっぱいいる しかも全員超絶 Hacker
  11. 11. Lisp は難しいって良く聞くよ! そんな Super Hacker 向け言語を、 ( 僕 | 私 ) も使えるようになるのかな?
  12. 12. Lisp は実用言語!怖くないよ! ちょっと加齢臭のするとこはあるけどな!
  13. 13. Lisp は長年使われてきたので その時々の流行とか 知恵が詰まってる ちょっと詰め込みすぎで整理できてない感もある先人の知恵を拝借して楽できるということでもある
  14. 14. 商用 Lisp 処理系売ってる会社は 食えている 粛々とお仕事に Lisp を使っている たくさんの人たちがいる 我々はオタクの腐海に 孤独に漕ぎ出そうとしているんじゃない
  15. 15. で、本題。
  16. 16. Pythonista のための Lisp 入門
  17. 17. 今日は最初なのでイントロだけ
  18. 18. 対象は Common Lisp
  19. 19. 対象は Common Lisp 処理系はいろいろあるけどSteelBank Common Lisp というやつを使いますよ
  20. 20. 対象は Common LispScheme とかいう象牙の塔は今のところ無視してかまいません
  21. 21. 対象は Common LispEmacs Lisp は本物の Lisp ですが古文・漢文の世界です 現代文を学んでいる間は忘れましょう
  22. 22. Lisp→Python→Lisp な俺から言わせると
  23. 23. Python を使えるならLisp なんて余裕じゃね? とか思うんです。
  24. 24. Python と Lisp は意外と似てるしな! そりゃそうだよ Python のほうが新しい言語で いろんな言語のいい所を 上手に取捨選択して取り込んでるもの
  25. 25. では、まず関数とか見てみる
  26. 26. ぱいそんdef fact(x): result = 0L for i in xrange(1, x + 1): result *= i return resultりすぷ(defun fact(x) (if (< x 1) 1 (* x (fact (1- x))) ))
  27. 27. ぱいそんdef fact(x): result = 0L for i in xrange(1, x + 1): result *= i return resultりすぷ(defun fact(x) (if (< x 1) 1 (* x (fact (1- x))) )) カッコつけて再帰とか使わなくてもいいよ!
  28. 28. ぱいそんdef fact(x): result = 1 for i in xrange(1, x + 1): result *= i return resultりすぷ(defun fact(x) (let ((result 1)) (loop for i from 1 to x do (setf result (* result i))) result))
  29. 29. ぱいそんdef fact(x): result = 1 for i in xrange(1, x + 1): result *= i return resultりすぷ(defun fact(x) (let ((result 1)) (loop for i from 1 to x do (setf result (* result i))) Common Lisp は「ループ上等」な世界 result))末尾再帰原理主義者の戯言はガン無視してよし!
  30. 30. 確かに似てはいる…しかし…
  31. 31. そんなに括弧ばかりで大丈夫か?
  32. 32. 大丈夫だ。問題ない。 Python のインデントの代わりに 括弧を使っていると思えばいい普通はエディタがよろしくインデントしてくれるしな!
  33. 33. さっきの例はあまりにアレなのでもうすこしカッコつけた fact 関数
  34. 34. (defun fact(x) (apply #*  (loop for i from 1 to x collect i))) ベタなループでチマチマ掛け算なんて 小学生までよねー って感じ?
  35. 35. で、最初の単純ループ版とさっきのカッコつけバージョンの コンパイル結果を見ると
  36. 36. 単純ループ版 157bytesカッコつけ版 440bytes
  37. 37. m9(^Д^)素直に書くって大事!
  38. 38. 気を取り直してデータ型とか見てみる
  39. 39. ぱいそんl = [1, "a", "b", ["ham", "spam"], 5]l[0] → 1l[1:] → [a, b, [ham, spam], 5]l[3] → [ham, spam]l[3][0] → ham5 in l → Truefor x in l: print xりすぷ(setf l (1 "a" "b" ("ham" "spam") 5)(car l) → 1(cdr l) → ("a" "b" ("ham" "spam") 5)(cadddr l) → ("ham" "spam")(car (cadddr l)) → "ham"(member 5 l) → (5)(loop for x in l do (print x))
  40. 40. ぱいそんd = dict()d["Hello"] = "World"d["Hello"] → "World"d[1] = 2len(d) → 2for (key, value) in d.items(): print("%s : %s" % (key, value))りすぷ(setf d (make-hash-table :test #equal))(setf (gethash "Hello" d) "World)(gethash "Hello" d) → "World"(setf (gethash 1 d) 2)(hash-table-count d) → 2(maphash #(lambda (key value) (princ (format nil "~a : ~a~%" key value))) d)
  41. 41. ぱいそんclass Greeting(object): def __init__(self): self.name = None def setName(self, name): self.name = name def hello(self, name=None): print("Hello %s!" % name if name else self.name)obj = greeting()obj.hello(name="World")りすぷ(defclass Greeting () ((name :initform nil)))(defmethod set-name ((self Greeting) name) (setf (slot-value self name) name))(defmethod hello ((self Greeting) &key name) (princ (format nil "Hello ~a!~%" (or name (slot-value self name)))))(setf obj (make-instance Greeting)(hello obj :name "World")
  42. 42. …… なんか、全然違くね?
  43. 43. 見た目に騙されてはイカ〜ン! 機能としては同じものが提供されてるし 面倒な部分は 言語そのものをカスタマイズ してしまえば無問題!
  44. 44. 言語そのものをカスタマイズするだって?
  45. 45. 言語そのものをカスタマイズ!?
  46. 46. (setf count 10)(do () ((<= count 0)) (print count) (setf count (1- count))(defmacro while (test-exp &body body) `(do () ((not ,test-exp)) ,@body))(setf count 10)(while (>= count 0) (print count) (setf count (1- count)) )(defmacro for ((init-exp test-exp update-exp) &body body) `(do ((,@init-exp ,update-exp)) ((not ,test-exp)) ,@body))(for ((count 10) (> count 0) (decf count 1)) (print count))
  47. 47. 構文要素を自由に追加できるよ! こういうのは関数とかライブラリとかじゃ 実現不能
  48. 48. 「めんどくせーなー」と思ったら俺様流にカスタマイズ これ!
  49. 49. ただしやりすぎると 他人がまったく読めない謎言語に変貌するという諸刃の剣
  50. 50. 素人にはお勧めできないけど、使い所をちゃんと心得てればホントに便利な機能! macro については後日詳しく勉強するよ!
  51. 51. その他の Python と Lisp の対応は「 Lisp プログラマのための Python 入門」 by Peter Norvig を見てね!http://www.unixuser.org/~euske/doc/python/python-lisp-j.html
  52. 52. と、簡単に Lisp を紹介したので 実際に Lisp をお勉強する 環境の話をします
  53. 53. 準備するお道具● SBCL● Emacs● quicklisp● Windows を端末にしたい場合は ● Xming ● PuTTY の適切な設定
  54. 54. SBCL のインストール● emerge sbcl – できるだけ新しいのを使いたいので ~amd64 すべし – USE フラグは threads と unicode は必須で – インストールできたら ~/.sbclrc ファイルを作成&編集;; -*- coding: utf-8 -*-(setf sb-impl::*default-external-format* :utf-8)(setf sb-alien::*default-c-string-external-format* :utf-8)
  55. 55. Emacs のインストール● vi 派の人。ごめん、やっぱ Emacs 便利なんで。● ~amd64 はしなくていいです。● USE フラグとかは capella で equery uses emacs とかして調べてね!● あと、日本語入力のために USE フラグに emacs を指定して emerge anthy● 自分の ~/.emacs.el 持ってない人は ~ransui/.emacs.el コピーして適当に編集して使っ て下さい。
  56. 56. QuickLisp のインストール● PyPi みたいなもん● wget http://beta.quicklisp.org/quicklisp.lisp● sbcl --load quicklisp.lisp ● (quicklisp-quickstart:install) ● ややあって ● (ql:add-to-init-file) ● (ql:quickload "quicklisp-slime-helper") ● (quit)
  57. 57. Xming のインストール● ここから DL してインストール – http://www.straightrunning.com/XmingNotes/● PuTTY の 設定パネルで ● 接続→ SSH→X11 で ● X11 フォワーディング:チェック ● X ディスプレイの場所 localhost:10 – 鯖側の sshd_conf で X11Forwarding が有効になってい るかを確認
  58. 58. Eclipse 使いたいひと向け情報● cusp っていう Lisp 用の Plug-in があるらしい – 情報は ● http://bitfauna.com/projects/cusp/index.html    にある。● dandelion ってのもあるらしい – 情報は ● http://sourceforge.net/projects/dandelion-ecl/● 使ってみた人、感想希望 – もし超イケてるのであれば、 Emacs から乗り換えも有り
  59. 59. 参考書● ふくちゃんのブログ見てね! – http://caddr.blog98.fc2.com/● 最初のお勧めは – Common Lisp 入門 – 実践 Common Lisp● On Lisp はオンラインで読める – http://www.komaba.utmc.or.jp/~flatline/onlispjhtml/ – けど、このテキストは Lisp の基礎は分かってるレベルを想定してる
  60. 60. 宿題● Emacs + SLIME もしくは eclipse とかの環境を ちゃんと作っておいてね!● 次回から実際にプログラム書きます● どういう形式でやるかは考え中 ● ハンズオン形式? ● 全員がノート PC 持ってるわけじゃないし…

×