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-10-25

第21回慢性的CL勉強会@Lingr8時だョ!全員集合まとめ

| 22:48 | 第21回慢性的CL勉強会@Lingr8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 第21回慢性的CL勉強会@Lingr8時だョ!全員集合まとめ - わだばLisperになる

本日、10/25 20:00から21回目の勉強会を開催させて頂きました!

発言して頂いた方約9名、observer(ROM)の方約6名前後で、大体16名前後を推移しつつでした。

今回は、onjo(lispuser.net)さんによる、永続化第2弾で、cl-prevalenceについてでした。

良かったところ

分かりやすい解説のお蔭でcl-prevalenceは思ったより敷居が低くシンプルな方式で、割と気軽に利用できるのではないかと思えました。

ログ:

謝辞:

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

Cyan風のif

| 03:10 | Cyan風のif - わだばLisperになる を含むブックマーク はてなブックマーク - Cyan風のif - わだばLisperになる

デフォルトでif-let風味なCyanのifが面白いので、CLのマクロで真似してみました。

2種類考えたのですが、letのバインド部をそのまんまifの判定のところに埋め込んでしまったバージョンのcifと、代入的な構文の時のみif-letに展開されて普通の場合はifになるというcif2です。

やはり、変数が複数になった場合どうするんだろうねという感じなのですが、cifは全部のandをとる、cif2は、変数1つということにしました。

ちなみに、if-letとの違いですが形がちょっと違ってるだけです(笑)

;;; cif
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun car-or-atom (obj)
    (if (consp obj)
      (car obj)
      obj)))

(defmacro cif (pred con &optional alt)
  (let ((vars (mapcar #'car-or-atom pred)))
    `(let ,pred
       (declare (ignorable ,@(remove nil vars)))
       (if (and ,@vars)
           ,con
           ,alt))))

;; 動作
(cif ((x "そのとおり") (y t) (z (zerop (random 2))))
     (format t "はい~A~%" x)
     (format t "いいえ~%"))
;=> はいそのとおり(ランダム)

;;; cif2
(eval-when (:compile-toplevel :load-toplevel :execute)
  (defun cif-bind-p (obj)
    (and (consp obj)
         (= 3 (length obj))
         (string-equal "=" (second obj)))))
  
(defmacro cif2 (pred con &optional alt)
  (if (cif-bind-p pred)
      `(let ((,(first pred) ,(third pred)))
         (cif2 ,(first pred) ,con ,alt))
      `(if ,pred ,con ,alt)))

;; 動作
(cif2 (x := "そのとおり")
      (format t "はい~A~%" x)
      (format t "いいえ~%"))
;=> はいそのとおり

(cif2 "そのとおり"
      (format t "はい~%")
      (format t "いいえ~%"))
;=> はい

Cyan面白い

| 01:56 | Cyan面白い - わだばLisperになる を含むブックマーク はてなブックマーク - Cyan面白い - わだばLisperになる

L-99でトラックバックが飛んで来たのでTB元を覗いてみたのですが、LISP風なマクロが書けつつS式でないという面白い俺言語の作者さんのブログでした。

この俺言語はCyan(さいあん)というらしいのですが、面白そうなので早速インストール。

インストールは、Ubuntu 8.04では「→no title」のページからダウンロードして展開するだけでした。

マクロが書けるということで、やっぱり早速マクロを書いてみようという感じなのですが、とりあえず、aifだろうということで、作ってみました。

mac(aif)^(pred, con, alt):
  `let^(&opt it = ?pred):
     if(it):
       ?con
      else:
       ?alt

aif("こんにちは", say(it), say(it))
#=> こんにちは。

しかし、これだと、構文っぽくないので、サンプルコードを探していたら、なんと最初からaifが定義してありました(*'-')

ということで、それを参考に書き直し

mac(maif)^(pred, con, &key alt):
  `let^(&opt it = ?pred):
     if(it, ?con, :else ?alt)

maif("こんにちは"):
  say(it)
 else:
  false
#=> こんにちは

aifが最初から備え付けであったので、じゃあ、when-letを定義してみようということで、定義してみました。

mac(whenlet)^(var, val, body):
  `let^(&opt ?var = ?val):
     if(?val, ?body, :else false)

whenlet(x, 3):
  say(x)
#=> 3

Cyanのletの形式と合せる程マクロの書き方を分かっていないので中途半端な感じなのですが、色々探っていたら、Cyanの場合、元から、if等は、if-letの様な動きをすることが分かりました。

if(x = "そのとおり"):
  say("はい" + x)
 else:
  say("いいえ")
#=> はいそのとおり

なるほど! これは便利。

他にもCyanには面白いところが沢山あるので動かして色々試してみると楽しいと思います!

ゲスト



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