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-31

KMRCLを眺める (2) let-if

| 00:37 | KMRCLを眺める (2) let-if - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (2) let-if - わだばLisperになる

毎日KMRCLからマクロ/関数を1つずつだらだらと読んでいこうと思っていましたが、早速2、3日間が空いてしまいました。

let-if

今日は、前回のlet-whenと殆ど同じな、let-ifです。

使われ方としては、

(LET-IF (FILE (PROBE-FILE "/etc/passwd---"))
        FILE
        (PRINT "No such file or directory"))
;=> "No such file or directory"

みたいな感じでしょうか。

マクロ定義はこんな感じです。

(defmacro let-if ((var test-form) if-true &optional if-false)
  `(let ((,var ,test-form))
      (if ,var ,if-true ,if-false)))

そのままですね。

if-falseでnilが束縛されたvarが使いたいかというと、そういうこともあまり無いような気もしますが、使いたいこともあるでしょう。

どういう風にインデントして書くか微妙ですが、とりあえず、IFと同じような感じに揃えてみました。

let-when、when-let、let-if等は、単に並べ替えのマクロなので初めて書いてみたりするマクロとして良いかもしれません。

ちなみに、これらは、Emacs Lispでもそのままのマクロ定義で動くと思います。

※optional引数があるので、Emacs lispでは、(require 'cl)してdefmacro*を使う必要はあるようです。