Soumettre la recherche
Mettre en ligne
kyotolisp#1 LT3 美しいLispの書き方 (1)
•
10 j'aime
•
6,607 vues
H
hayato_hashimoto
Suivre
kyotolisp#1 (kyotolisp.github.com) で発表した内容です。スライドは(2)に続きます。
Lire moins
Lire la suite
Technologie
Signaler
Partager
Signaler
Partager
1 sur 22
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
T. Suwa
例外設計における大罪
例外設計における大罪
Takuto Wada
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
Yoshimura Soichiro
gRPC入門
gRPC入門
Kenjiro Kubota
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
paiza
Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
健一 辰濱
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
Yugo Shimizu
Recommandé
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Pythonの理解を試みる 〜バイトコードインタプリタを作成する〜
Preferred Networks
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
PPL 2022 招待講演: 静的型つき函数型組版処理システムSATySFiの紹介
T. Suwa
例外設計における大罪
例外設計における大罪
Takuto Wada
並行処理初心者のためのAkka入門
並行処理初心者のためのAkka入門
Yoshimura Soichiro
gRPC入門
gRPC入門
Kenjiro Kubota
paizaのオンラインジャッジを支えるDockerとその周辺
paizaのオンラインジャッジを支えるDockerとその周辺
paiza
Cloud Firestore を使って、Polling をやめたい話
Cloud Firestore を使って、Polling をやめたい話
健一 辰濱
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
Yugo Shimizu
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
Format string Attack
Format string Attack
icchy
Gaucheでマクロを書こう
Gaucheでマクロを書こう
Hideaki Nagamine
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
yieldとreturnの話
yieldとreturnの話
bleis tift
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
JavaScript難読化読経
JavaScript難読化読経
Yosuke HASEGAWA
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
MediaPipeの紹介
MediaPipeの紹介
emakryo
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
智啓 出川
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
cct-inc
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
こわくない Git
こわくない Git
Kota Saito
Emacs上のターミナルを最強に
Emacs上のターミナルを最強に
Lintaro Ina
すごいConstたのしく使おう!
すごいConstたのしく使おう!
Akihiro Nishimura
async/await のしくみ
async/await のしくみ
信之 岩永
床下からCommon Lisp
床下からCommon Lisp
Kazuhiro Hishinuma
Vimとgo
Vimとgo
三四郎 平原
Contenu connexe
Tendances
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
CRDT in 15 minutes
CRDT in 15 minutes
Shingo Omura
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Shota Shinogi
Format string Attack
Format string Attack
icchy
Gaucheでマクロを書こう
Gaucheでマクロを書こう
Hideaki Nagamine
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
yieldとreturnの話
yieldとreturnの話
bleis tift
Unified JVM Logging
Unified JVM Logging
Yuji Kubota
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
JavaScript難読化読経
JavaScript難読化読経
Yosuke HASEGAWA
Java仮想マシンの実装技術
Java仮想マシンの実装技術
Kiyokuni Kawachiya
MediaPipeの紹介
MediaPipeの紹介
emakryo
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeNA
Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
智啓 出川
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
cct-inc
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
こわくない Git
こわくない Git
Kota Saito
Emacs上のターミナルを最強に
Emacs上のターミナルを最強に
Lintaro Ina
すごいConstたのしく使おう!
すごいConstたのしく使おう!
Akihiro Nishimura
async/await のしくみ
async/await のしくみ
信之 岩永
Tendances
(20)
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
CRDT in 15 minutes
CRDT in 15 minutes
CyberChefの使い方(HamaCTF2019 WriteUp編)
CyberChefの使い方(HamaCTF2019 WriteUp編)
Format string Attack
Format string Attack
Gaucheでマクロを書こう
Gaucheでマクロを書こう
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
yieldとreturnの話
yieldとreturnの話
Unified JVM Logging
Unified JVM Logging
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
JavaScript難読化読経
JavaScript難読化読経
Java仮想マシンの実装技術
Java仮想マシンの実装技術
MediaPipeの紹介
MediaPipeの紹介
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
DeClang 誕生!Clang ベースのハッキング対策コンパイラ【DeNA TechCon 2020 ライブ配信】
Fortranが拓く世界、VSCodeが架ける橋
Fortranが拓く世界、VSCodeが架ける橋
Parser combinatorってなんなのさ
Parser combinatorってなんなのさ
Pythonによる黒魔術入門
Pythonによる黒魔術入門
こわくない Git
こわくない Git
Emacs上のターミナルを最強に
Emacs上のターミナルを最強に
すごいConstたのしく使おう!
すごいConstたのしく使おう!
async/await のしくみ
async/await のしくみ
En vedette
床下から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
En vedette
(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
Similaire à 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
Similaire à 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
Dernier
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Toru Tamaki
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
WSO2
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
CRI Japan, Inc.
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
CRI Japan, Inc.
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
Toru Tamaki
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
atsushi061452
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
iPride Co., Ltd.
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
sn679259
Dernier
(10)
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
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 ... )
Télécharger maintenant