SlideShare ist ein Scribd-Unternehmen logo
1 von 22
Downloaden Sie, um offline zu lesen
美しいlispの書きかた

~コーディングルール事始め~
自己紹介
github.com/insanity です。ときおりWiki{pedia,books}に出没し
ます。
得意な方言はScheme です。
 今年で使い初めてから4年目です。
 Gauche が便利過ぎてしねる。
 ちなみにこのスライドもlibcairo on Gauche with c-wrapper で
 レンダリングされています。
   現状カオスなコードですが一応 github/insanity/lightcontain
   er で晒してます。
自己紹介 (続き)
エディタはいつもvimを使っています。
 .el を書くまでもなく、その場のコマンドで定型作業をサクッと終
 える作りが好きなのです。
というわけで、今回の話はemacsに全部お任せでOKという結論では
ないです。
今日の話題

せっかくなら、読みやすいlispを書きたい。

マクロ展開形やVMの中間表現を少しでも読みやすく表示したい。

過去に書きなぐったコードを、見栄えだけ良くしたい。

元ネタ
Riastradh's Lisp Style Rules by Taylor R. Campbell
(http://mumble.net/~campbell/scheme/style.txt)
名前づけ
常識ですが...
 variable-with-long-name

Lispの変数はハイフンでつなぎます。日本語キーボードで変換キー
をハイフンを割り当てると便利です。(linuxならxmodmap)

 *global-variable*

グローバル変数です。グローバル変数は副作用によって変更される
かもしれない、という警告の意味で(多分)、強調します。

定数を表すときもあります。SOME-CONSTANTよりかは読みやすい
と思います。 +some-constant+と書く流派もあるようです。
コードレイアウト
(スペースの入れ方)
はじめに

S式のコードの見た目は、スペースと改行の入れ方でほとんど決まり
ます。
だから、スペースと改行の入れ方は大事です。
タブか、スペースか

lispではインデント揃えを使うので、タブ幅で悩まないスペースがお
すすめです。

どうしてもタブがいい人は、タブ幅を書いてくれると(僕が)うれしい
。
; -*- tab-width: 8 -*-
; vim:ts=8
ネスト
(cdr
  (assq
     'banana
     '( (banana . 138)
        (apple . 80))))

普通、括弧はまとめて閉じます。
インデント量はスペース1つでも大丈夫ですが,

(インデント量が
   (多すぎると、
       (すぐに
             (横幅を
                    (使い切ってしまい
                       (困ります))))))



そもそも読みにくいと思います。
ネスト (続き)

項目の一覧表では、
((item "banana")
 (item "apple")
 (item "orange")
 )

と閉じ括弧だけの行を残すと、項目の追加がやりやすくなります。

見栄え的にはちょっと微妙ですが。
ネスト (続き)

誤解のおそれのないときは、深さを省略しても大丈夫です(多分)。


( define (get-continuaction)
   (call/cc (lambda (cont)
     (cont cont))))

Scheme ではlambda をやたらめったら使うので、ネストがすぐに深
くなるのでちょっと横着しています。

map for-each では、手続きとリストを区別するために、省略しない
方が読みやすい。
閉じ括弧を優雅に見せようとして、
( define (any pred lst)
 ( cond
    ((null? args) #f)
    ((pair? args) (or (pred (car lst))
                      (any pred (cdr lst))
)) )              )

と書く人[Gassanenko,2001]もいるそうですが、論理的に矛盾して
います。(なのでemacsマクロが必須だとか。

視覚的情報は括弧に頼らず、インデントの深さで判断するようにす
るのがベストと思っています。
縦モードと横モード

 横モード

普通は横につなげて書きます。
(map * '(1 2 3) (iota 3 2 0.1))

 縦モード

括弧の中身が長くなったときは、括弧の中身を縦につなげます。
(map *
     '(1 2 3)
     (iota 3 2 0.1))
縦モードと横モード (続き)

横モード → 縦モードへの移行は可ですが、それ以外は不可です。
例
( 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))
平行四辺形コードは、上から下へ流れるように読めるので、ネスト
の多いS式は、最初から縦モードで書くのがおすすめです。

 例外

:keyword value の組や、arc のように括弧が書略されている時は横
に並べたほうが見やすいです。
深さインデントと、揃えインデント

深さインデントは、純粋に括弧の深さでスペースの量を決めます。
( define (is-a? obj type)
   (eq? (car obj) type))

( defun is-a? (obj type)
   (eqp (car obj) type))
))
揃えインデントは、第一引数の位置に、それ以後の引数の位置を合
わせる方式です
(list (apply average lis)
      (apply min lis)
      (apply max lis))

揃えインデントの方をCanonicalとみなす人が多いようですが、多用
するとコードがすぐに右へ飛んでいってしまうので、個人的には深
さインデントが好みです。

letの束縛部、and, or, list, 四則演算に限って使うことにしています
。
cond, caseの書きかた

条件部を見やすく揃えるのが大事です。
( cond
   ((pred   a) ...)
   ((pred   b) ...)
( cond
   ((pred   a)
      ...
      ...   )
   ((pred   b)
      ...
      ...   ))

どちらかに統一するといい感じです。
空行

基本的には、トップレベル定義の区切り、internal defineの区切り
にのみ使います。ただし、「手続き型」の関数で、コメント行の前
に空行を入れるのはありだと思います。


( define (test)
   ( define (test-aux-1)
      ... )

  ( define   (test-aux-2)
     ... )

  body ... )

Weitere ähnliche Inhalte

Was ist angesagt?

低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
demuyan
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

Was ist angesagt? (20)

(公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017 (公開版)FPGAエクストリームコンピューティング2017
(公開版)FPGAエクストリームコンピューティング2017
 
Tackling Complexity
Tackling ComplexityTackling Complexity
Tackling Complexity
 
Ruby で高速なプログラムを書く
Ruby で高速なプログラムを書くRuby で高速なプログラムを書く
Ruby で高速なプログラムを書く
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
私とOSSの25年
私とOSSの25年私とOSSの25年
私とOSSの25年
 
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
 
低レイヤー入門
低レイヤー入門低レイヤー入門
低レイヤー入門
 
C++ マルチスレッド 入門
C++ マルチスレッド 入門C++ マルチスレッド 入門
C++ マルチスレッド 入門
 
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜 リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
リアルタイムサーバー 〜Erlang/OTPで作るPubSubサーバー〜
 
TRICK 2022 Results
TRICK 2022 ResultsTRICK 2022 Results
TRICK 2022 Results
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
C# 式木 (Expression Tree) ~ LINQをより深く理解するために ~
 
なぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのかなぜ自社で脆弱性診断を行うべきなのか
なぜ自社で脆弱性診断を行うべきなのか
 
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
導入から 10 年、PHP の trait は滅びるべきなのか その適切な使いどころと弱点、将来について
 
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
 
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメオブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 

Andere mochten auch (6)

床下からCommon Lisp
床下からCommon Lisp床下からCommon Lisp
床下からCommon Lisp
 
Vimとgo
VimとgoVimとgo
Vimとgo
 
Redesigning Common Lisp
Redesigning Common LispRedesigning Common Lisp
Redesigning Common Lisp
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Vimから見たemacs
Vimから見たemacsVimから見た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 2017AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
AI and Machine Learning Demystified by Carol Smith at Midwest UX 2017
 

Ähnlich wie kyotolisp#1 LT3 美しいLispの書き方 (1)

coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2
Atsushi Tadokoro
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
mametter
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
Nobukazu Hanada
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
mitamex4u
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
 

Ähnlich wie kyotolisp#1 LT3 美しいLispの書き方 (1) (20)

良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
 
coma Creators session vol.2
coma Creators session vol.2coma Creators session vol.2
coma Creators session vol.2
 
LT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきたLT#7 Hello coffeeしてきた
LT#7 Hello coffeeしてきた
 
C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話C・C++用のコードカバレッジツールを自作してみた話
C・C++用のコードカバレッジツールを自作してみた話
 
Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11Our docsys-pyfes-2012-11
Our docsys-pyfes-2012-11
 
141115 making web site
141115 making web site141115 making web site
141115 making web site
 
⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1⑳CSSでアニメーション!その1
⑳CSSでアニメーション!その1
 
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
超絶技巧 Ruby プログラミング - Esoteric, Obfuscated Ruby Programming
 
Start!! Ruby
Start!! RubyStart!! Ruby
Start!! Ruby
 
Programming camp 2008, Codereading
Programming camp 2008, CodereadingProgramming camp 2008, Codereading
Programming camp 2008, Codereading
 
2009年のPHPフレームワーク
2009年のPHPフレームワーク2009年のPHPフレームワーク
2009年のPHPフレームワーク
 
こんにちはGroovy
こんにちはGroovyこんにちはGroovy
こんにちはGroovy
 
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3ng-japan 2015 TypeScript+AngularJS 1.3
ng-japan 2015 TypeScript+AngularJS 1.3
 
2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk2008.10.18 L4u Tech Talk
2008.10.18 L4u Tech Talk
 
Programming camp code reading
Programming camp code readingProgramming camp code reading
Programming camp code reading
 
資料
資料資料
資料
 
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみているF#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
 
Erlangご紹介 websocket編
Erlangご紹介 websocket編Erlangご紹介 websocket編
Erlangご紹介 websocket編
 
201207 ssmjp
201207 ssmjp201207 ssmjp
201207 ssmjp
 

Kürzlich hochgeladen

Kürzlich hochgeladen (7)

Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 

kyotolisp#1 LT3 美しいLispの書き方 (1)