Submit Search
Upload
Lisp Tutorial for Pythonista : Day 3
•
2 likes
•
3,320 views
Ransui Iso
Follow
Lisp meets Web : A tutorial of Portable AllegroServe and build a tiny BBS application.
Read less
Read more
Technology
Report
Share
Report
Share
1 of 33
Recommended
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Material
Material
_TUNE_
たのしい関数型
たのしい関数型
Shinichi Kozake
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
SatoYu1ro
Recommended
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Material
Material
_TUNE_
たのしい関数型
たのしい関数型
Shinichi Kozake
これから Haskell を書くにあたって
これから Haskell を書くにあたって
Tsuyoshi Matsudate
クロージャデザインパターン
クロージャデザインパターン
Moriharu Ohzu
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
Hideyuki Tanaka
15分でざっくり分かるScala入門
15分でざっくり分かるScala入門
SatoYu1ro
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
Map
Map
kikairoya
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
BOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
Haskell超入門 Part.1
Haskell超入門 Part.1
Yuichi Watanabe
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
重建街的故事
重建街的故事
kirstykirsty
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
More Related Content
What's hot
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Relations Team
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
dcomsolution
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
Map
Map
kikairoya
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
Hiroto Yamakawa
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Preferred Networks
Visual C++で使えるC++11
Visual C++で使えるC++11
nekko1119
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
なおき きしだ
BOF1-Scala02.pdf
BOF1-Scala02.pdf
Hiroshi Ono
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Kousuke Ruichi
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
templateとautoの型推論
templateとautoの型推論
MITSUNARI Shigeo
Haskell超入門 Part.1
Haskell超入門 Part.1
Yuichi Watanabe
Sml#探検隊
Sml#探検隊
Hiroki Mizuno
C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
What's hot
(20)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
【java8 勉強会】 怖くない!ラムダ式, Stream API
【java8 勉強会】 怖くない!ラムダ式, Stream API
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Map
Map
60分で体験する Stream / Lambda ハンズオン
60分で体験する Stream / Lambda ハンズオン
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
Visual C++で使えるC++11
Visual C++で使えるC++11
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
BOF1-Scala02.pdf
BOF1-Scala02.pdf
並行プログラミングと継続モナド
並行プログラミングと継続モナド
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
JavaScript 講習会 #1
JavaScript 講習会 #1
templateとautoの型推論
templateとautoの型推論
Haskell超入門 Part.1
Haskell超入門 Part.1
Sml#探検隊
Sml#探検隊
C++11概要 ライブラリ編
C++11概要 ライブラリ編
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
Viewers also liked
重建街的故事
重建街的故事
kirstykirsty
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
Ransui Iso
프레젠테이션1
프레젠테이션1
성아 박
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
Ransui Iso
Curriculum Vitae Morello Orfeo
Curriculum Vitae Morello Orfeo
Orfeo Morello
Danza lenta
Danza lenta
CastelBrando
Viewers also liked
(7)
重建街的故事
重建街的故事
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Lisp Tutorial for Pythonista : Day 4
Lisp Tutorial for Pythonista : Day 4
프레젠테이션1
프레젠테이션1
Lisp Tutorial for Pythonista : Day 5
Lisp Tutorial for Pythonista : Day 5
Curriculum Vitae Morello Orfeo
Curriculum Vitae Morello Orfeo
Danza lenta
Danza lenta
Similar to Lisp Tutorial for Pythonista : Day 3
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
啓 小笠原
Lisp batton - Common LISP
Lisp batton - Common LISP
Masaomi CHIBA
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
Tomonobu_Hirano
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
Masahiro Hayashi
Tokyor23 doradora09
Tokyor23 doradora09
Nobuaki Oshiro
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
yushin_hirano
Erlangやってみた
Erlangやってみた
ina job
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
Processing
Processing
Akifumi Nambu
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
博文 斉藤
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
Satoshi imai
中3女子でもわかる constexpr
中3女子でもわかる constexpr
Genya Murakami
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
ericsagnes
Write good parser in perl
Write good parser in perl
Jiro Nishiguchi
Boost Fusion Library
Boost Fusion Library
Akira Takahashi
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Hiromi Ishii
Ekmett勉強会発表資料
Ekmett勉強会発表資料
時響 逢坂
Boost.Flyweight
Boost.Flyweight
gintenlabo
Similar to Lisp Tutorial for Pythonista : Day 3
(20)
Clojure programming-chapter-2
Clojure programming-chapter-2
PHP AST 徹底解説
PHP AST 徹底解説
関数型言語&形式的手法セミナー(3)
関数型言語&形式的手法セミナー(3)
Lisp batton - Common LISP
Lisp batton - Common LISP
第一回Data mining勉強会 -第二章
第一回Data mining勉強会 -第二章
初心者講習会資料(Osaka.R#7)
初心者講習会資料(Osaka.R#7)
Tokyor23 doradora09
Tokyor23 doradora09
第一回Data mining勉強会 -第二章 - 原案
第一回Data mining勉強会 -第二章 - 原案
Erlangやってみた
Erlangやってみた
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Processing
Processing
GNU awk (gawk) を用いた Apache ログ解析方法
GNU awk (gawk) を用いた Apache ログ解析方法
lispmeetup#63 Common Lispでゼロから作るDeep Learning
lispmeetup#63 Common Lispでゼロから作るDeep Learning
中3女子でもわかる constexpr
中3女子でもわかる constexpr
eZ Publish勉強会9月〜テンプレート言語〜
eZ Publish勉強会9月〜テンプレート言語〜
Write good parser in perl
Write good parser in perl
Boost Fusion Library
Boost Fusion Library
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Ekmett勉強会発表資料
Ekmett勉強会発表資料
Boost.Flyweight
Boost.Flyweight
More from Ransui Iso
「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Ransui Iso
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
Ransui Iso
アドテクを支える人と技術
アドテクを支える人と技術
Ransui Iso
Playing with curses
Playing with curses
Ransui Iso
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
Ransui Iso
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
Ransui Iso
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
Ransui Iso
Introduction of ToySynth
Introduction of ToySynth
Ransui Iso
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
Ransui Iso
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.
Ransui Iso
More from Ransui Iso
(10)
「Pythonでやってみた」~広がるプログラミングの愉しみ~
「Pythonでやってみた」~広がるプログラミングの愉しみ~
Pythonで作る俺様サウンドエフェクター
Pythonで作る俺様サウンドエフェクター
アドテクを支える人と技術
アドテクを支える人と技術
Playing with curses
Playing with curses
小中学生Hack-a-thonにオッサンが乗り込んだ話
小中学生Hack-a-thonにオッサンが乗り込んだ話
XML-RPC : Pythonが「電池付属」と呼ばれる理由
XML-RPC : Pythonが「電池付属」と呼ばれる理由
ソフトシンセを作りながら学ぶPythonプログラミング
ソフトシンセを作りながら学ぶPythonプログラミング
Introduction of ToySynth
Introduction of ToySynth
PyQtではじめるGUIプログラミング
PyQtではじめるGUIプログラミング
PySynth : A toy pure python software synthesizer.
PySynth : A toy pure python software synthesizer.
Recently uploaded
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
osamut
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
sugiuralab
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Ryo Sasaki
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
iPride Co., Ltd.
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
furutsuka
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
iPride Co., Ltd.
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
Shota Ito
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
danielhu54
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
Atomu Hidaka
Recently uploaded
(9)
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
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.
いやー。ヒント出しすぎ もう、余裕で作れるでしょ?