C や C++ から Common Lisp に移って (2015年7月版)

C や C++ から Common Lisp の世界に移って、 もちろん根本的に違う機能も多いが、 似ている部分もありつつ表面的な表記の違いで混乱する事もある。 後になると、慣れてしまって思い出せない気がするので今のうちに書いておく。 用語はかなり C や C++ よりで Common Lisp 的に間違ってる可能性が大きい。

インデント

一般にコードは構造に合わせてインデントを行う。 例えば C のスタイルでありがちなのは、 インデントはブロックの深さに合わせて4つずつ規則的にインデントする。 たまに引数の多い関数とかは引数毎に改行され関数引数の開始位置に合わせていたりして、4インデントが破られる。

    int variable0 = 0;
    int variable1 = 1;
    printf("%d\n", variable0);
    printf("%d\n", variable1);

Common Lisp でも様々なコーディングスタイルがあると思うが何となく Emacs の SLIME を使うと、 基本は 2 スペースのインデントが行われるが、 C の関数引数の改行のような何らかの構造の先頭に揃えられる事が非常に多い。 このなんらかの構造の先頭はカッコやキーワードやユーザーの定義した名称など様々で、 インデント幅もそれに合わせたサイズになり2スペースという規則は破られる。(SLIME が勝手にやってくれる)

(let ((variable0 0)
      (variable1 1))    ; 2スペースじゃない
  (print variable0)
  (print variable1))

よく古典的にアレなLispのアレで「カッコガー」とかあるが、 規則正しく 4 スペースの世界とかから移り住んで来ると、 こっちの方が大きく違和感があるのではないだろうか?

別にそれはそれで規則性があるので、 すぐになれてしまうが。

識別子名

CやC++の場合、 識別子として大文字と小文字は区別され、 upper camel case派とlower camel case派とsnake case派等がある。 でもなんかその昔は C で camel case 見なかった気がするが気のせいか?

Common Lispの場合、 識別子として大文字と小文字は区別がなく、 慣習的に小文字とハイフンで書く。(本当はその他記号とか数字とかもある) 慣習的にシステム側の出力は大文字で表示される。

構造体のアクセス

C/C++ の場合には、構造体のアクセスにオブジェクト名とメンバ変数名でアクセきる。 (コード例は実行不可能だし、不定値見にいったり、大分よろしくないが)

struct A
{
    int member;
};

A object;
object.member;

Common Lisp の場合には、make-構造体名のコンストラクタや、構造体名-スロット名のアクセサが自動で定義される。 アクセサにも構造体名がくっついてくるの、何か冗長な感じがする。

(defstruct structure-name
  (member 0))
(defvar *object*)
(let ((*object* (make-structure-name)))
  (structure-name-member *object*))

パッケージシステム

C は多分ない。 C++名前空間がある。

Common Lisp はパッケージシステムを持っているが、 シンボルがよく分からないのでパッケージもよく分からない。