Submit Search
Lisp Tutorial for Pythonista : Day 3
2 likes
3,329 views
Ransui Iso
Lisp meets Web : A tutorial of Portable AllegroServe and build a tiny BBS application.
Technology
Read more
1 of 33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
More Related Content
PDF
Lisp tutorial for Pythonista : Day 2
Ransui Iso
PDF
Material
_TUNE_
PDF
たのしい関数型
Shinichi Kozake
PDF
これから Haskell を書くにあたって
Tsuyoshi Matsudate
PDF
クロージャデザインパターン
Moriharu Ohzu
PDF
ゲーム開発者のための C++11/C++14
Ryo Suzuki
PDF
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
PDF
15分でざっくり分かるScala入門
SatoYu1ro
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Material
_TUNE_
たのしい関数型
Shinichi Kozake
これから Haskell を書くにあたって
Tsuyoshi Matsudate
クロージャデザインパターン
Moriharu Ohzu
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
15分でざっくり分かるScala入門
SatoYu1ro
What's hot
(20)
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
PPTX
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
PDF
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
PDF
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
PPTX
Map
kikairoya
PDF
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
PDF
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
PDF
Pfi Seminar 2010 1 7
Preferred Networks
PPTX
Visual C++で使えるC++11
nekko1119
PDF
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
PDF
BOF1-Scala02.pdf
Hiroshi Ono
PDF
並行プログラミングと継続モナド
Kousuke Ruichi
PDF
Unity2015_No10_~UGUI&Audio~
CHY72
PDF
JavaScript 講習会 #1
Susisu
PDF
templateとautoの型推論
MITSUNARI Shigeo
PDF
Haskell超入門 Part.1
Yuichi Watanabe
KEY
Sml#探検隊
Hiroki Mizuno
PDF
C++11概要 ライブラリ編
egtra
ODP
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
Map
kikairoya
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Pfi Seminar 2010 1 7
Preferred Networks
Visual C++で使えるC++11
nekko1119
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
BOF1-Scala02.pdf
Hiroshi Ono
並行プログラミングと継続モナド
Kousuke Ruichi
Unity2015_No10_~UGUI&Audio~
CHY72
JavaScript 講習会 #1
Susisu
templateとautoの型推論
MITSUNARI Shigeo
Haskell超入門 Part.1
Yuichi Watanabe
Sml#探検隊
Hiroki Mizuno
C++11概要 ライブラリ編
egtra
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
Ad
Viewers also liked
(7)
PPTX
重建街的故事
kirstykirsty
PDF
Lisp tutorial for Pythonista : Day 1
Ransui Iso
PDF
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
PPT
프레젠테이션1
성아 박
PDF
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
PDF
Curriculum Vitae Morello Orfeo
Orfeo Morello
PPS
Danza lenta
CastelBrando
重建街的故事
kirstykirsty
Lisp tutorial for Pythonista : Day 1
Ransui Iso
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
프레젠테이션1
성아 박
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
Curriculum Vitae Morello Orfeo
Orfeo Morello
Danza lenta
CastelBrando
Ad
Similar to Lisp Tutorial for Pythonista : Day 3
(20)
PDF
Lisp Tutorial for Pythonista Day 6
Ransui Iso
ODP
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
PPT
2008.10.18 L4u Tech Talk
mitamex4u
PDF
Lisp study
Taichi Kimura
PDF
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Satoshi imai
ODP
Real World OCamlを読んでLispと協調してみた
blackenedgold
PDF
Shibuya.lisp #28: 仮題: R について
tnoda
PDF
Clojure
yshigeru
PDF
Erlangやってみた
ina job
ODP
Introduction to Erlang/OTP
Masahiko Sakamoto
PDF
PythonでLispを実装した (evalつき)
t-sin
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
PDF
スタートHaskell2 型を信じろ
Satoshi KOJIMA
PDF
Shibuyalisp6lt
kenhys
PDF
Start haskell zipper
Shoko Sasaki
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
PDF
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
ODP
webを飾る技術
ina job
PDF
みんなもっとツール作ろうよ
wizstargaer
PPTX
Control.Arrow
haru haru
Lisp Tutorial for Pythonista Day 6
Ransui Iso
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
m2ym
2008.10.18 L4u Tech Talk
mitamex4u
Lisp study
Taichi Kimura
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Satoshi imai
Real World OCamlを読んでLispと協調してみた
blackenedgold
Shibuya.lisp #28: 仮題: R について
tnoda
Clojure
yshigeru
Erlangやってみた
ina job
Introduction to Erlang/OTP
Masahiko Sakamoto
PythonでLispを実装した (evalつき)
t-sin
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
スタートHaskell2 型を信じろ
Satoshi KOJIMA
Shibuyalisp6lt
kenhys
Start haskell zipper
Shoko Sasaki
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Kent Ohashi
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
webを飾る技術
ina job
みんなもっとツール作ろうよ
wizstargaer
Control.Arrow
haru haru
More from Ransui Iso
(10)
PPTX
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Ransui Iso
PDF
Pythonで作る俺様サウンドエフェクター
Ransui Iso
PDF
アドテクを支える人と技術
Ransui Iso
PDF
Playing with curses
Ransui Iso
PDF
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
PDF
XML-RPC : Pythonが「電池付属」と呼ばれる理由
Ransui Iso
PDF
ソフトシンセを作りながら学ぶPythonプログラミング
Ransui Iso
PDF
Introduction of ToySynth
Ransui Iso
PDF
PyQtではじめるGUIプログラミング
Ransui Iso
PDF
PySynth : A toy pure python software synthesizer.
Ransui Iso
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Ransui Iso
Pythonで作る俺様サウンドエフェクター
Ransui Iso
アドテクを支える人と技術
Ransui Iso
Playing with curses
Ransui Iso
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
XML-RPC : Pythonが「電池付属」と呼ばれる理由
Ransui Iso
ソフトシンセを作りながら学ぶPythonプログラミング
Ransui Iso
Introduction of ToySynth
Ransui Iso
PyQtではじめるGUIプログラミング
Ransui Iso
PySynth : A toy pure python software synthesizer.
Ransui Iso
Lisp Tutorial for Pythonista : Day 3
1.
Lisp tutorial for
Pythonista. Day #3 : Lisp meets web. Ransui Iso Strategic Technology Group, X-Listing Co, Ltd.
2.
宿題やった?
3.
今日は Web アプリだよ!
超基本部分しかやらないけど モチベーション維持のためにもネタは重要
4.
Allegro Serve ってのがある
有名な商用処理系の Allegro Common Lisp に ついてくる Web サーバとちょっとしたフレームワーク
5.
Portable Allegroserve
ってのを使います Allegro serve を他の処理系でも使えるように 移植したやつがあるので、有り難く使わさせて頂く
6.
インストールは簡単
最初の日にインストールした QuickLisp を使うです CLUSER> (ql:systemapropos "aserve") #<SYSTEM aserve / portableaserve20101006cvs / quicklisp 20101207> NIL CLUSER> (ql:quickload "aserve") **** なんかいろいろでる **** ("aserve") CLUSER>
7.
QuickLisp の更新方法 リポジトリとかたまに更新されるのでチェックしとけ! CLUSER> (ql:updateclient) Installed version 2010121400 is as new as upstream version 2010121400. No update. T CLUSER> (ql:updatealldists) No update available for "quicklisp 20101207". NIL
8.
REPL 環境下でテストしてみる ●
とりあえずお約束の Hello World から CLUSER> (require :aserve) NIL CLUSER> (usepackage :net.aserve) T CLUSER> (usepackage :net.html.generator) T CLUSER> (start :port 4040) #<WSERVER port 4040 {1002D47421}> CLUSER> (defun helloworld (request entity) (withhttpresponse (request entity) (withhttpbody (request entity) (princ "Hello World" *htmlstream*)))) HELLOWORLD CLUSER> (publish :path "/helloworld" :contenttype "text/plain; charset=utf8" :function #'helloworld) で、ブラウザで http://localhost:4040/helloworld にアクセス
9.
UTF8 なんだし日本語出るだろ jk ●
.sbclrc に設定もしてるし大丈夫じゃね? CLUSER> (defun helloworld (request entity) (withhttpresponse (request entity) (withhttpbody (request entity) (princ " 波浪ワールド " *htmlstream*))))
10.
UTF8 なんだし日本語出るだろ jk ●
.sbclrc に設定もしてるし大丈夫じゃね? CLUSER> (defun helloworld (request entity) (withhttpresponse (request entity) (withhttpbody (request entity) (princ " 波浪ワールド " *htmlstream*)))) 2aserveworker: 01/04/11 17:56:08 while processing command "GET /helloworld HTTP/1.1" got error The value 27874 is not of type (UNSIGNEDBYTE 8). 多バイト文字文化圏の悲哀!
11.
unicode/byte 文字列変換 ●
最終的に byte 列として解釈できりゃ OK らしい (defun bintostr (data) (let* ((size (length data)) (octets (makearray size :elementtype '(unsignedbyte 8) :fillpointer 0))) (dotimes (i size) (vectorpush (charcode (elt data i)) octets)) (sbext:octetstostring octets :externalformat :utf8))) ● ついでなので逆変換もいっとけ (defun strtobin (str) (let* ((octets (sbext:stringtooctets str :externalformat :utf8 :nullterminate nil)) (size (length octets)) (result (makearray size :elementtype 'character :fillpointer 0))) (dotimes (i size) (vectorpush (codechar (elt octets i)) result)) result))
12.
また色々新しいの出た! 例によってザックリと解説
13.
let と let*
の違い ● let は変数束縛が同時に起こる感じ ● (let ((x 10) (y 20) ● (z (+ x y)) ● ● ... body ... ) ● ● z の初期化には x と y が必要だけど、初期化は * 同時 * なので x,y ともにまだ存在しない!なので未定義変数参照エラー。 ● let* は変数束縛が逐次的に起こる感じ (let* ((x 10) (y 20) (z (+ x y)) ... body ... ) ● こっちは問題ない。この差は多分にコンパイラの都合。
14.
配列の作成 ●
make-array で作成する (makearray 次元指定 or 最大サイズ :elementtype データ型 :initialcontents 初期値 :fillpointer 要素の追加位置ポインタを使うか? :adjustable サイズを可変にするか? 他にもオプションあるけど、普通使うのはこんくらい (setf arr (makearray 3 :elementtype 'simplestring :initialcontents '("ham" "spam" "egg")) (serf arr (makearray '(2 2) :elementtype 'integer :initialcontents '((1 0) (0 1))) (setf arr (makearray 0 :fillpointer t :adjustable t))
15.
配列の参照と書き換え ●
単純に参照する場合は aref か elt を使う (setf arr (makearray 3 :elementtype 'integer)) (setf (aref arr 0) 0) (setf (elt arr 1) 5) (setf (aref arr 5) 10) ← 当然のことながらエラー aref は配列専用で elt はシーケンス汎用。 aref のほうが効率はいいはず。 ● fill-pointer を使うと色々便利 (setf arr (makearray 3 :elementtype 'integer :fillpointer t)) (fillpointer arr) (setf (fillpointer arr) 0) arr (vectorpush 1 arr) (vectorpush 2 arr) (vectorpush 3 arr) (vectorpush 4 arr) ← 配列の長さを超えたので値は追加できない :adjustable を t に指定して vectorpushextend を使えば可変長配列として 要素ををどんどん追加できる。
16.
dotimes フォーム ●
単純なカウンタ付きループ (dotimes (var maxvalue resultvalue) body) ● 変数 var は 0 からスタートして ( maxvalue 1) まで回る ● resultvalue でループが終了したときの dotimes フォームの戻 り値を指定できる。省略時は nil 。 ● body は普通に色々書けばいい。 – ループを脱出したい場合は return を使う。この場合 resultvalue は使われ ない。 – return と書くのが気持ち悪い人は (defmacro breakloop (&body body) `(return ,@body)) とか定義しておくとちょびっと幸せかも。 – ちなみに break って名前はすでに cl:break として使われてて、デバッガへ 行くとかいう機能になってるですと!こんなイイ名前をもったいない!
17.
他のパッケージ内のシンボルの参照 ●
2 つの参照方法がある ● packagename:symbolname – 公開 (export されている ) シンボルを参照する ● packagename::symbolname – 非公開 (export されていない ) シンボルを強制的に参照する sb-ext パッケージ SBCL の拡張機能 sb-impl パッケージ SBCL の内部実装へのインタフェース
18.
さっきまでのプログラムをファイルに書く ●
pastebin 見てね ● http://pastebin.com/7AfPE0GG ● helloworld.lisp とか名前をつけて保存 ● 実行と終了 ● sbcl load helloworld.lisp ● REPL が生きてるので (quit) で終了できる ● リロード ● REPL で (load "helloworld.lisp") ● (publishpages)
19.
パッケージに関する操作 ●
(require :modulename) ● 標準パッケージはこれでロードできる。 ● (asdf:oos 'asdf:loadop :modulename) ● インストールされているモジュールをロードする ● QuickLisp でインストールしたモジュールも内部では ASDF の管 理下にある ● (usepackage :packagename) ● Python で言うところの from packagename import * に似 ているけど、名前空間の操作しかしない点が異なる。
20.
HTML で出力してみる ●
html マクロを使う (defun hellohtmlworld (request entity) (withhttpresponse (request entity) (withhttpbody (request entity) (html (:html (:head (:title (u " 波浪ワールド "))) (:body (:h1 (u " 波浪ワールド ")) ((:p :style "color: red;") (u " 赤い文字ですよ ")) ((:p :style (format nil "color: ~a;" (nth (random 5) '("red" "blue" "green" "purple" "black")))) (u " ここはランダムで色が変わるのです ")) ))) ))) Lisp の中にテンプレートが完全に組み込まれてますよ! テンプレの中に処理もそのまま書ける!
21.
HTML マクロの基礎 ●
(:tagname body) ● タグ名はキーワードで指定する ● タグに囲まれる値部分はリストの要素として書く ● ((:tagname :attrname value) body) ● タグに属性をつけたい場合はタグ全体をリスト化して属性名をキー にしたキーワード引数風味に書く ● 値部分は普通の書き方と同じ ● テンプレ的機能 ● body とか value 部分には「バイナリ文字列」を返す S 式が書ける – 便宜的にバイナリ文字列って言ってるよ – いまんとこはマルチバイト文字想定される時は u マクロで囲んどけ。
22.
フォームの取り扱い ●
入力欄は普通に書けばイイ (defun hello (request entity) (withhttpresponse (request entity) (withhttpbody (request entity) (html (:html (:head (:title (u " あいさつ "))) (:body (:h1 (u " あいさつ ")) ((:form :method "POST" :action "greeting") ((:input :type "text" :name "name" :value "")) ((:input :type "submit" :name "greetingbutton" :value "Hi!")) ) )) ))))
23.
フォーム値の取り出し方法 ●
request 引数に入ってるので引っ張り出す (defun getfieldvalue (request fieldname) (cdr (assoc fieldname (requestquery request) :test #'equal))) – assoc 関数:連想リストを検索する ● 連想リストとは ((key1 value1) (key2 value2) ...) 形式のリスト。すごく単純な Key Value データの表現。 ● 線形検索なので当然のことながら効率は良くない。 ● が、 hashtable に比べればずっとお手軽。 – requestquery 関数は ((name1 . value1) (name2 . value2) ...) 形式の dot pair のリストでフォーム値を返す ● dot pair については先週のスライド見てね
24.
テンプレへの値の埋め込み ●
:princsafe キーワードを使おう ● < > & をエスケープしてくれるので安全 (defun greeting (request entity) (let ((name (getfieldvalue request "name"))) (if (null name) (setf name " 名無しさん ") (setf name (bintostr name))) (withhttpresponse (request entity) (withhttpbody (request entity) (html (:html (:head (:title (u " あいさつ "))) (:body (:h1 (u " あいさつ ")) (:p (:princsafe (u (format nil "Hello ~a" name)))) )) ))))) (format t ... ) : 標準出力ストリームへ書き出す (format nil ... ) : ストリームへの書き出し無し
25.
お待ちかねの課題です
26.
こんなの作ってね!
超シンプル掲示板!
27.
書きこまれたデータの保持 ●
SQL 系は次回やる予定なので、今回はオンメモリ (defvar *bbsdatas* nil) (defun addnewarticle (subject body) (push (cons subject body) *bbsdatas*))
28.
テンプレートの構成
書き込みエリア ページ全体 表示エリア
29.
ページ全体テンプレート ●
こんな感じかな? (defun pagetemplate () (html (:html (:head (:title "Tiny BBS")) (:body (writesectiontemplate) (dolist (article *bbsdatas*) (viewtemplate article))))))
30.
表示部分のテンプレ ●
こんな感じ (defun viewtemplate (article) (html ((:div :style "border: 1px solid black; padding: 2px;") ((:div :style "backgroundcolor: lightgray; color: black;") (:princsafe (u (car article)))) (:pre (:princsafe (u (cdr article))))) ))
31.
で、あと書かなきゃいけないのは
書き込み部分のテンプレ コントローラ関数 :bbs
32.
コントローラ関数 bbs の作り方のヒント ●
request からフォーム値を取り出す ● 書き込みボタンが押されてたら – add-new-article を呼ぶ ● ページ全体テンプレを呼ぶ ● おしまい!
33.
いやー。ヒント出しすぎ もう、余裕で作れるでしょ?