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-02-14

Arcでcond

| 17:42 | Arcでcond - わだばLisperになる を含むブックマーク はてなブックマーク - Arcでcond - わだばLisperになる

どうもArcのifには我慢できなくなったのでマクロでcondを作ってみることにしました。

ちょちょっと作業をしてみたのですが、SLIMEに馴れ切った自分にはSLIMEの助けが無いとマクロが書けないことに、はたと気付いてしまいました。

つまりマクロの展開形が簡単に確認できないと無計画にマクロを書けなということですね…。

そういうわけで遠回りながら、まず簡単にmacex1の結果が見れるようにしてみました。

といっても、Emacsのlisp-eval-region関数をちょっといじっただけのものを作っただけです。

EmacsのArc-modeが待ち遠しい…。

(defun arc-mecex1-region (start end &optional and-go)
  (interactive "r\nP")
  (comint-send-string (inferior-lisp-proc) "(ppr (macex1 '")
  (comint-send-region (inferior-lisp-proc) start end)
  (comint-send-string (inferior-lisp-proc) "))\n")
  (if and-go (switch-to-lisp t)))

これで気休め程度はマクロが書きやすくなったので、condの作成

;; そのまんまバージョン
(mac cond body
  `(if ,@(mappend [list car._ `(do ,@cdr._)] body)))

;; elseも使えるバージョン
(mac cond body
  `(if ,@(mappend [list (let x _.0 (or is!else.x x)) `(do ,@cdr._)]
		  body)))

;; 動作
(cond (a b)
      (c d)
      (else e))
;マクロ展開 =>
;(if a (do b) c (do d) t (do e))

新しい構文も取り入れて書いてみましたが、ArcはどんどんPerl化して行っている気がする!