Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-03-17

大文字と小文字を区別しない

| 06:06 | 大文字と小文字を区別しない - わだばLisperになる を含むブックマーク はてなブックマーク - 大文字と小文字を区別しない - わだばLisperになる

先日のPAIP読書会でNorvig先生がRETURNだけ見易いように大文字で書いている例から、もちらっと話題になったのですが、Common Lispは歴史的なLISP処理系と同様に大文字と小文字を区別しません。(設定すれば可能ですが…)

この辺は古臭いという風にも捉えられますが、区別しないということを利用して色々とコードを読み易いように工夫をしている例があります。

ということで、適当に色々なスタイルを列挙してみます。

  • コードはとりあえず全部小文字。コメントは、普通の文章と一緒
(defun hello-world ()  
  "Hello, World!")              ;Hello, World!

最近はこれが主流だと思います。他の言語もこれが普通なので、その影響だと思われます。

  • コードはとりあえず全部大文字。コメントは、普通の文章と一緒
(DEFUN HELLO-WORLD ()
  "Hello, World!")              ;Hello, World!

1970年代後半位までは、こっちが主流だったようです。

Zmacs(LispマシンのEmacs)には、こういうスタイルを支援する、Electric Shift Lock ModeというCAPS Lockが掛ったような動作をするマイナーモードがありました。コードの部分では、シフトキーの役割が引っくり返るんですが、コメントや、文字列の中では、普通という秀逸なモードです。

  • とにかく全部大文字
(DEFUN HELLO-WORLD ()
  'HELLO-WORLD)              ;HELLO, WORLD!

1970年代前半位までこんな感じです。というより、大文字しか扱えなかったシステムが多かったようだったようなので、必然かもしれません。

色々工夫している例

ここからは、大文字と小文字を区別しないシステムの失われつつある文化の領域になってきます。

目につくところだけ集めてみました。細かいこだわりになると無数にあるようで、眺めていると結構面白いです。

  • Tは大文字で書く(MacLISP等)
(cond ((< n 2) n)
      (T 'hello)))

(cond ((null lst) n)
      ('T 'hello))
... etc

Tにはクオートを付けたりもします。しかし対応するnilは小文字というのが謎。

  • gotoのタグは大文字で書く(MacLISP等)
(prog (lst)
   L  (cond ((null lst) (return 'hello)))
      (pop lst)
      (go L))

タグは大文字で書かれることが多かったようです。

(defun LIVE-ARRAYS (kind)
  ...)

これは今でもちらほらみかけます。

  • マクロの定義で、展開された結果になる所は大文字で書く(MacLISP等)
(defmacro SETQ-IF-UNBOUND (&rest args)
  (do ((a args (cddr a))
       (l () (cons `(OR (BOUNDP ',(car a)) (SETQ ,(car a) ,(cadr a))) l)))
      ((null a) 
       (cond ((null (cdr l)) (car l))
	     (`(PROGN ,.(nreverse l)))))))

(setq-if-unbound x 3 y 5)
;=> (PROGN (OR (BOUNDP 'X) (SETQ X 3)) (OR (BOUNDP 'Y) (SETQ Y 5)))

これは良く思い付いたなと感心しますが、MacLISPでは結構このスタイルで書いてる人がいます。

  • システム定義のものは大文字、ユーザ定義のものは小文字で書く(TI-Explorer)
(DEFUN search-and-or (substrings string)
  (DECLARE (optimize (compilation-speed 0) (safety 1) (SPACE 2) (speed 3))
	   (inline search-and-or simple-string-search))
  (LOOP for and in substrings
	unless (IF (ATOM and)
		    (simple-string-search and string)
		  (LOOP for or in and do
			(IF (ATOM or)
			    (WHEN (simple-string-search or string) (RETURN t))
			  (LOCALLY (DECLARE (notinline search-and-or))
			    (search-and-or or string)))))
	do (RETURN nil)
	finally (RETURN t)))

MacLISPとは逆でシステムが大文字な例です。

  • 上記に加え、なんでか知らないが、defun等、def-系だけ先頭を大文字にする(TI-Explorer)
(Defun ALL-ARGLIST-BEFORE-&AUX (arglist)  
;; return a copy of the arglist up to but excluding &aux
  (LET ((pos (POSITION '&aux (the list arglist) )))
    (IF pos 
	(FIRSTN pos arglist) 
	arglist)))

以上、大文字小文字を区別しないことを不自由と考えるか、自由と考えるか、様々だと思いますが、自由と考えている風な例を取り上げてみました。