Claude-skill-registry cl-coding-style
Common Lispのコーディング規約を適用。Lispコード作成・レビュー時に使用
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/cl-coding-style" ~/.claude/skills/majiayu000-claude-skill-registry-cl-coding-style && rm -rf "$T"
manifest:
skills/data/cl-coding-style/SKILL.mdsource content
Common Lisp Coding Style
Based on Google Common Lisp Style Guide (@references/google-common-lisp-style-guide.md)
命名規則
関数・変数
- 通常の名前:
(例:kebab-case
,find-user-by-id
)parse-json-string - 述語関数:
サフィックス (例:-p
,valid-user-p
)empty-list-p - 変換関数:
形式 (例:foo->bar
,string->symbol
)list->vector
特殊変数
- 動的変数:
(例:*earmuffs*
,*default-timeout*
)*current-connection* - 定数:
(例:+plus-signs+
,+max-retries+
)+default-buffer-size+
クラス・条件
- クラス名:
(例:kebab-case
,user-account
)http-request - 条件型:
,-error
サフィックス (例:-warning
)invalid-input-error
アクセサ
- リーダー:
(例:class-slot
,user-name
)request-method - ライター:
形式(setf class-slot) - アクセサ: 両方を提供する場合
インデント
- 基本: 2スペースインデント
- タブ禁止: スペースのみ使用
- Emacsスタイル: 標準的なLispインデントに従う
;; Good (defun process-items (items) (loop for item in items when (valid-p item) collect (transform item))) ;; Bad - インデント不正 (defun process-items (items) (loop for item in items when (valid-p item) collect (transform item)))
パッケージ参照
シンボル形式
- 推奨:
形式 (uninterned symbol)#: - 許容: キーワード形式
:symbol - 非推奨: 文字列形式
"SYMBOL"
;; Good (defpackage #:my-project (:use #:cl) (:import-from #:alexandria #:if-let #:when-let) (:export #:main #:run)) ;; Acceptable (defpackage :my-project (:use :cl) (:export :main)) ;; Bad - 文字列形式 (defpackage "MY-PROJECT" (:use "CL"))
import-from vs use
- :import-from: 明示的なシンボル指定(推奨)
- :use: パッケージ全体の取り込み(CLのみ推奨)
フォーマット
行長
- 推奨: 100文字以内
- 最大: 120文字
空行
- 関数間: 1行
- セクション間: 2行まで
- 連続空行: 最大2行
括弧
- 閉じ括弧: 同一行に連続配置
- 開き括弧後の改行: 必要な場合のみ
;; Good - 閉じ括弧は連続 (defun foo () (let ((x 1) (y 2)) (+ x y))) ;; Bad - 閉じ括弧が分離 (defun foo () (let ((x 1) (y 2)) (+ x y) ) )
ドキュメント
Docstring
- 関数: 目的と引数を説明
- 変数: 用途を説明
- クラス: 役割を説明
(defun find-user (id &key (include-deleted nil)) "Find a user by ID. Arguments: ID - The user's unique identifier INCLUDE-DELETED - If true, include soft-deleted users Returns: USER object or NIL if not found" ...) (defvar *connection-pool* "Pool of database connections for reuse.")
制御構造
when/unless vs if
- when: else節なしの場合
- unless: 否定条件の場合
- if: 両方の分岐がある場合
;; Good (when (valid-p x) (process x)) (unless (empty-p list) (first list)) (if (ready-p) (start) (wait)) ;; Bad - ifをwhenで書くべき (if (valid-p x) (process x) nil)
cond vs if
- cond: 3つ以上の分岐
- if: 2分岐
;; Good - condを使用 (cond ((< n 0) 'negative) ((= n 0) 'zero) (t 'positive)) ;; Bad - ネストしたif (if (< n 0) 'negative (if (= n 0) 'zero 'positive))