Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
continuation_web_framework_scheme.pdf
Niyarin
July 25, 2019
Programming
0
330
continuation_web_framework_scheme.pdf
Niyarin
July 25, 2019
Tweet
Share
More Decks by Niyarin
See All by Niyarin
Scheme用nREPLの開発(エラー出力の改善)
niyarin
0
74
bel lispの紹介
niyarin
0
390
nanopass-compiler-frameworkを使ってみました
niyarin
0
240
Gorgos-parser-combinator-written-in-scheme
niyarin
0
220
outputting-beautiful-s-expression
niyarin
0
200
Serialisp
niyarin
1
550
Mongo DBとS式検索
niyarin
0
170
goodbye-python-repl
niyarin
0
180
SchemeのEphemeronとWeak Pairの説明
niyarin
0
610
Other Decks in Programming
See All in Programming
SwiftPMのPlugin入門 / introduction_to_swiftpm_plugin
uhooi
2
110
存在しないアセットへの参照と 未公開アセットでのネタバレに どう立ち向かうか / How to prevent missing assets and spoilers by assets
orgachem
0
180
エンジニア向け会社紹介資料/engineer-recruiting-pitch
xmile
PRO
0
110
Rust、何もわからない...#6発表資料
ryu19
0
140
PHPアプリケーションにおけるアーキテクチャメトリクスについて / Architecture Metrics in PHP Applications
isanasan
1
280
良質な技術記事を量産する秘訣 / #MeetsPro
jnchito
16
4.7k
花き業界のサプライチェーンを繋げるプロダクト開発の進め方
userlike1
0
180
Glance App Widgetでウィジェットを作ろう / MoT TechTalk #15
mot_techtalk
0
130
Excelの助けを借りて楽にシナリオを作ろう
rpa_niiyama
0
330
Functional Data Engineering - A Blueprint for adopting functional principles in data pipeline
vananth22
0
190
Hono v3 - Do Everything, Run Anywhere, But Small, And Faster
yusukebe
4
140
なぜRubyコミュニティにコミットするのか?
luccafort
0
320
Featured
See All Featured
Infographics Made Easy
chrislema
235
17k
The Invisible Side of Design
smashingmag
292
48k
Adopting Sorbet at Scale
ufuk
65
7.8k
In The Pink: A Labor of Love
frogandcode
132
21k
A Tale of Four Properties
chriscoyier
149
21k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
29
7.9k
VelocityConf: Rendering Performance Case Studies
addyosmani
317
22k
How GitHub Uses GitHub to Build GitHub
holman
465
280k
Intergalactic Javascript Robots from Outer Space
tanoku
261
26k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
217
21k
The Art of Programming - Codeland 2020
erikaheidi
36
11k
For a Future-Friendly Web
brad_frost
166
7.8k
Transcript
継続と アプリケーション (Schemeのオレオレ・Toy・Webフレームワークの紹介) Niyarin
オレオレ・Toy・WebFrameworkを作っています ・継続ベース ・プロトタイプ/学習用なのでセキュリティ、その他はてきとう ・未完成 niyarin/oreore-toy-webframework-scm 継続ベースのWebフレームワークはそれなりにある GaucheのKahua Ypsilonのlunula RacketのWebFramework
etc. 1
継続とは(てきとう) 特徴 ・ジャンプ ・値を渡せる ・状態を保持 (+ 1 (call/cc (lambda (c)
(c 2))) 3) ;6 (define out-c #f) (+ 1 (call/cc (lambda (c) (set! out-c c) (c 2))) 3) (out-c 100) ;104 2
継続をWEBアプリケーションに使う1 ・セッションの保存 . . . リクエスト1 レスポンス1 リクエスト2 レスポンス2 クライアントA
サーバー クライアントA name Taro old 30 セッションデータ (let ((name “Taro”) (old 30)) (call/cc (lambda (cont) ;contにセッション情報をのせる body …))) 3
継続をWEBアプリケーションに使う2 ・ページの遷移 localhost:8080/piyo?a=1&b=2 ↓ (… (call/cc (lambda (piyo) (set!
piyo-page cont))) …);遷移先のページ (piyo;遷移時に継続を呼び出す ‘((a 1) (b 2))) 4
コード紹介1:継続を使うと自然な記述ができる (define (index-page param) (let loop ((uname "") (password
"")) (let ((loginpage-data (call/cc (lambda (cont) (render `(ログインページ )))))) (cond ((not (validation loginpage-data)) (loop (get ‘uname content) (get ‘password content))) (else (render `(OKページ)))))) sample/sample.scm(一部省略) (define (index param) (let loop () (let ((data (read))) (cond ((failure? data) (loop)) (else (display “OK”))))) 同じ構造のプログラム 5
(otw-render-view `(html (body (div (@ (style "color:#ff0000")) ,error-message) (form (@
(action ,(otw-generate-uri cont)) ;生成結果=> piyo?contid=1 (method "post")) (input (@ (type "text") (name "uname") (value ,uname))) (input (@ (type "password") (name "password"))) (input (@ (type "submit") (value "Submit")))))) コード紹介2:どのように継続を渡すのか ID-継続の組で管理して、IDのほうを渡している ※ URLにID埋め込んでいるが、セキュ リティ的には✗ =>継続ハイジャック 6
実装中バグらせた話 (define (index-page param) (let loop ((uname "") (password
"")) (let ((loginpage-data (call/cc (lambda (cont) (render `(ログインページ )))))) (cond ((not (validation loginpage-data)) (loop (get ‘uname content) (get ‘password content))) (else (render `(OKページ)))))) 1. 赤い部分で止める必要がある なにもしないと、青い領域に入る ・render内で大域脱出する ・限定継続ベースにするのも手 2. 2つは違うリクエストなので、レスポン スを出力するポートは別 ・レキシカルな場所(左だとparam)におく と継続に補足される(古いポートが参照さ れる) ・外でスレッド-portで管理している 7
・継続を使うとWebアプリケーションを自然にかける ・いつか正式にリリースしたい 終わり