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 |

2009-10-05

Scheme風のCAR/CDR

| 04:09 | Scheme風のCAR/CDR - わだばLisperになる を含むブックマーク はてなブックマーク - Scheme風のCAR/CDR - わだばLisperになる

Common Lispでは、(CAR () ) ⇒ NIL、(CDR () ) ⇒ NILになります。

これは、MacLISPINTERLISPから受け継いだ伝統で、実用上は一々エラーにならなくて便利だったりするのですが、自分は、Schemeのようにエラーになってくれた方が気付きにくいバグを見付けやすいので好きだったりもします。

Schemeのようにエラーにする良い方法はないかなと思っていたのですが、こういう時には、THEが上手く使えるんじゃないかということでメモ。

(LET ((LIST () ))
  (CAR (THE CONS LIST)))
;>>> The value NIL is not of type CONS. 
 
(LET ((LIST () ))
  (CDR (THE CONS LIST)))
;>>> The value NIL is not of type CONS. 

ちなみに、THEがエラーを上げるかどうかは処理系依存みたいです。

全然関係ないですが、HyperSpecを眺めていたら、THEはSETFとも組合せられるとのこと。

(LET (X)
  (SETF (THE INTEGER X) 30))
;⇒ 30

(LET (X Y)
  (SETF (THE (VALUES INTEGER SYMBOL) (VALUES X Y)) 
        (VALUES 30 'FOO)))
;⇒ 30,
;   FOO

なるほどー。