Enviar pesquisa
Carregar
kyotolisp#1 LT3 美しいLispの書き方 (1)
•
10 gostaram
•
6,607 visualizações
H
hayato_hashimoto
Seguir
kyotolisp#1 (kyotolisp.github.com) で発表した内容です。スライドは(2)に続きます。
Leia menos
Leia mais
Tecnologia
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 22
Baixar agora
Baixar para ler offline
Recomendados
Gaucheでマクロを書こう
Gaucheでマクロを書こう
Hideaki Nagamine
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
ReDosトラック内発表資料
ReDosトラック内発表資料
Yujiro Yahata
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
Recomendados
Gaucheでマクロを書こう
Gaucheでマクロを書こう
Hideaki Nagamine
関数型プログラミング入門 with OCaml
関数型プログラミング入門 with OCaml
Haruka Oikawa
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
Yuki Tamura
ReDosトラック内発表資料
ReDosトラック内発表資料
Yujiro Yahata
Lockfree Queue
Lockfree Queue
Kumazaki Hiroki
なかったらINSERTしたいし、あるならロック取りたいやん?
なかったらINSERTしたいし、あるならロック取りたいやん?
ichirin2501
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
Keisuke Fukuda
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
T. Suwa
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
Ryoma Sin'ya
yieldとreturnの話
yieldとreturnの話
bleis tift
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
hbstudy# 28 SELinux HandsOn 公開版
hbstudy# 28 SELinux HandsOn 公開版
Hiroki Ishikawa
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
ClojurianからみたElixir
ClojurianからみたElixir
Kent Ohashi
SlideShareをやめて Speaker Deckに移行します
SlideShareをやめて Speaker Deckに移行します
Moriwaka Kazuo
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
sleepy_yoshi
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
NSaitoNmiri
LR parsing
LR parsing
ichikaz3
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
mao999
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
床下からCommon Lisp
床下からCommon Lisp
Kazuhiro Hishinuma
Vimとgo
Vimとgo
三四郎 平原
Mais conteúdo relacionado
Mais procurados
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
T. Suwa
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
Ryoma Sin'ya
yieldとreturnの話
yieldとreturnの話
bleis tift
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
kiki utagawa
C++ マルチスレッド 入門
C++ マルチスレッド 入門
京大 マイコンクラブ
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
hbstudy# 28 SELinux HandsOn 公開版
hbstudy# 28 SELinux HandsOn 公開版
Hiroki Ishikawa
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
ClojurianからみたElixir
ClojurianからみたElixir
Kent Ohashi
SlideShareをやめて Speaker Deckに移行します
SlideShareをやめて Speaker Deckに移行します
Moriwaka Kazuo
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
sleepy_yoshi
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
NSaitoNmiri
LR parsing
LR parsing
ichikaz3
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Yoshio Hanawa
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
mao999
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
yohhoy
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
MITSUNARI Shigeo
Glibc malloc internal
Glibc malloc internal
Motohiro KOSAKI
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
Mais procurados
(20)
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
AVX2時代の正規表現マッチング 〜半群でぐんぐん!〜
yieldとreturnの話
yieldとreturnの話
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
C++ マルチスレッド 入門
C++ マルチスレッド 入門
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
hbstudy# 28 SELinux HandsOn 公開版
hbstudy# 28 SELinux HandsOn 公開版
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
ClojurianからみたElixir
ClojurianからみたElixir
SlideShareをやめて Speaker Deckに移行します
SlideShareをやめて Speaker Deckに移行します
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
ゆとり向けErlang入門 (1): メッセージパッシングことはじめ
リアルタイムOSの必要性とTOPPERS/SSPの紹介
リアルタイムOSの必要性とTOPPERS/SSPの紹介
LR parsing
LR parsing
PHP7の内部実装から学ぶ性能改善テクニック
PHP7の内部実装から学ぶ性能改善テクニック
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
0章 Linuxカーネルを読む前に最低限知っておくべきこと
0章 Linuxカーネルを読む前に最低限知っておくべきこと
20分くらいでわかった気分になれるC++20コルーチン
20分くらいでわかった気分になれるC++20コルーチン
条件分岐とcmovとmaxps
条件分岐とcmovとmaxps
Glibc malloc internal
Glibc malloc internal
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
Destaque
床下からCommon Lisp
床下からCommon Lisp
Kazuhiro Hishinuma
Vimとgo
Vimとgo
三四郎 平原
Redesigning Common Lisp
Redesigning Common Lisp
fukamachi
おいしいLisp
おいしいLisp
Kent Ohashi
Vimから見たemacs
Vimから見たemacs
Shougo
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
Carol Smith
Destaque
(6)
床下からCommon Lisp
床下からCommon Lisp
Vimとgo
Vimとgo
Redesigning Common Lisp
Redesigning Common Lisp
おいしいLisp
おいしいLisp
Vimから見たemacs
Vimから見たemacs
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
Semelhante a kyotolisp#1 LT3 美しいLispの書き方 (1)
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Shigenori Sagawa
coma Creators session vol.2
coma Creators session vol.2
Atsushi Tadokoro
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
Shingo Inoue
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
simotin13 Miyazaki
Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11
Keiichiro Shikano
141115 making web site
141115 making web site
Himi Sato
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1
Nishida Kansuke
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
mametter
Start!! Ruby
Start!! Ruby
mitim
Programming camp 2008, Codereading
Programming camp 2008, Codereading
Hiro Yoshioka
2009年のPHPフレームワーク
2009年のPHPフレームワーク
Takuya Sato
こんにちはGroovy
こんにちはGroovy
irof N
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Nobukazu Hanada
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
Masahiro Wakame
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
Programming camp code reading
Programming camp code reading
Hiro Yoshioka
資料
資料
Bob_Mk2
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
Erlangご紹介 websocket編
Erlangご紹介 websocket編
Masatoshi Itoh
201207 ssmjp
201207 ssmjp
th0x0472
Semelhante a kyotolisp#1 LT3 美しいLispの書き方 (1)
(20)
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
coma Creators session vol.2
coma Creators session vol.2
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11
141115 making web site
141115 making web site
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
Start!! Ruby
Start!! Ruby
Programming camp 2008, Codereading
Programming camp 2008, Codereading
2009年のPHPフレームワーク
2009年のPHPフレームワーク
こんにちはGroovy
こんにちはGroovy
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
Programming camp code reading
Programming camp code reading
資料
資料
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
Erlangご紹介 websocket編
Erlangご紹介 websocket編
201207 ssmjp
201207 ssmjp
Último
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Último
(10)
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
kyotolisp#1 LT3 美しいLispの書き方 (1)
1.
美しいlispの書きかた ~コーディングルール事始め~
2.
自己紹介 github.com/insanity です。ときおりWiki{pedia,books}に出没し ます。 得意な方言はScheme です。
今年で使い初めてから4年目です。 Gauche が便利過ぎてしねる。 ちなみにこのスライドもlibcairo on Gauche with c-wrapper で レンダリングされています。 現状カオスなコードですが一応 github/insanity/lightcontain er で晒してます。
3.
自己紹介 (続き) エディタはいつもvimを使っています。 .el
を書くまでもなく、その場のコマンドで定型作業をサクッと終 える作りが好きなのです。 というわけで、今回の話はemacsに全部お任せでOKという結論では ないです。
4.
今日の話題 せっかくなら、読みやすいlispを書きたい。 マクロ展開形やVMの中間表現を少しでも読みやすく表示したい。 過去に書きなぐったコードを、見栄えだけ良くしたい。 元ネタ Riastradh's Lisp Style
Rules by Taylor R. Campbell (http://mumble.net/~campbell/scheme/style.txt)
5.
名前づけ
6.
常識ですが... variable-with-long-name Lispの変数はハイフンでつなぎます。日本語キーボードで変換キー をハイフンを割り当てると便利です。(linuxならxmodmap) *global-variable* グローバル変数です。グローバル変数は副作用によって変更される かもしれない、という警告の意味で(多分)、強調します。 定数を表すときもあります。SOME-CONSTANTよりかは読みやすい と思います。
+some-constant+と書く流派もあるようです。
7.
コードレイアウト (スペースの入れ方)
8.
はじめに S式のコードの見た目は、スペースと改行の入れ方でほとんど決まり ます。 だから、スペースと改行の入れ方は大事です。
9.
タブか、スペースか lispではインデント揃えを使うので、タブ幅で悩まないスペースがお すすめです。 どうしてもタブがいい人は、タブ幅を書いてくれると(僕が)うれしい 。 ; -*- tab-width:
8 -*- ; vim:ts=8
10.
ネスト (cdr (assq
'banana '( (banana . 138) (apple . 80)))) 普通、括弧はまとめて閉じます。
11.
インデント量はスペース1つでも大丈夫ですが, (インデント量が
(多すぎると、 (すぐに (横幅を (使い切ってしまい (困ります)))))) そもそも読みにくいと思います。
12.
ネスト (続き) 項目の一覧表では、 ((item "banana")
(item "apple") (item "orange") ) と閉じ括弧だけの行を残すと、項目の追加がやりやすくなります。 見栄え的にはちょっと微妙ですが。
13.
ネスト (続き) 誤解のおそれのないときは、深さを省略しても大丈夫です(多分)。 ( define
(get-continuaction) (call/cc (lambda (cont) (cont cont)))) Scheme ではlambda をやたらめったら使うので、ネストがすぐに深 くなるのでちょっと横着しています。 map for-each では、手続きとリストを区別するために、省略しない 方が読みやすい。
14.
閉じ括弧を優雅に見せようとして、 ( define (any
pred lst) ( cond ((null? args) #f) ((pair? args) (or (pred (car lst)) (any pred (cdr lst)) )) ) ) と書く人[Gassanenko,2001]もいるそうですが、論理的に矛盾して います。(なのでemacsマクロが必須だとか。 視覚的情報は括弧に頼らず、インデントの深さで判断するようにす るのがベストと思っています。
15.
縦モードと横モード 横モード 普通は横につなげて書きます。 (map *
'(1 2 3) (iota 3 2 0.1)) 縦モード 括弧の中身が長くなったときは、括弧の中身を縦につなげます。 (map * '(1 2 3) (iota 3 2 0.1))
16.
縦モードと横モード (続き) 横モード → 縦モードへの移行は可ですが、それ以外は不可です。
17.
例 ( let1 ht
(make-hash-table) body ...) ( if (not (is-a? language 'lisp)) (error "Please speak it in Lisp!.") (eval input env)) ;XXX (http-post http-client server port path `((id ,(sanitize (get-config 'user-id)) '((timeout 2000) (follow-redirect #f))
18.
平行四辺形コードは、上から下へ流れるように読めるので、ネスト の多いS式は、最初から縦モードで書くのがおすすめです。 例外 :keyword value
の組や、arc のように括弧が書略されている時は横 に並べたほうが見やすいです。
19.
深さインデントと、揃えインデント 深さインデントは、純粋に括弧の深さでスペースの量を決めます。 ( define (is-a?
obj type) (eq? (car obj) type)) ( defun is-a? (obj type) (eqp (car obj) type)) ))
20.
揃えインデントは、第一引数の位置に、それ以後の引数の位置を合 わせる方式です (list (apply average
lis) (apply min lis) (apply max lis)) 揃えインデントの方をCanonicalとみなす人が多いようですが、多用 するとコードがすぐに右へ飛んでいってしまうので、個人的には深 さインデントが好みです。 letの束縛部、and, or, list, 四則演算に限って使うことにしています 。
21.
cond, caseの書きかた 条件部を見やすく揃えるのが大事です。 ( cond
((pred a) ...) ((pred b) ...) ( cond ((pred a) ... ... ) ((pred b) ... ... )) どちらかに統一するといい感じです。
22.
空行 基本的には、トップレベル定義の区切り、internal defineの区切り にのみ使います。ただし、「手続き型」の関数で、コメント行の前 に空行を入れるのはありだと思います。 ( define
(test) ( define (test-aux-1) ... ) ( define (test-aux-2) ... ) body ... )
Baixar agora