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-11-04

KMRCLを眺める (6) aand

| 22:46 | KMRCLを眺める (6) aand - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (6) aand - わだばLisperになる

今日は、KMRCLのmacros.lispの中からAANDです。

使われ方としては、

(AAND (PROBE-FILE "/etc/passwd")
      (KMRCL:READ-FILE-TO-STRING IT)
      (SUBSEQ IT (PPCRE:SCAN "mysql" IT)))
#|
⇒ "mysql:x:115:126:MySQL Server,,,:/var/lib/mysql:/bin/false
Debian-exim:x:116:127::/var/spool/exim4:/bin/false
speech-dispatcher:x:117:29:Speech Dispatcher,,,:/var/run/speech-dispatcher:/bin/sh
couchdb:x:118:116:CouchDB Administrator,,,:/var/lib/couchdb:/bin/bash
kernoops:x:119:65534:Kernel Oops Tracking Daemon,,,:/:/bin/false"
|#

というのを無理矢理でっち上げました。

  1. ファイルが見付かったら
  2. そのファイルを一つの文字列にして
  3. mysqlが含まれる部分以降を出力する

です。これらの処理のでnilが返った時点でnilを返して次の節へは進まず打ち切りになります。

AANDは、itに束縛される内容が変化するというのが味噌ですね。

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

(defmacro aand (&rest args)
  (cond ((null args) t)
        ((null (cdr args)) (car args))
        (t `(aif ,(car args) (aand ,@(cdr args))))))

ちなみに、SchemeのSRFIには、AANDに似たようなものでありつつ、さらに汎用的なand-let*があります。

こちらには、Schemeの人が嫌いそうな、暗黙のitの束縛などはありません☺

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20091104