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

古えのnet.lang.lispからの拾い物

| 20:23 | 古えのnet.lang.lispからの拾い物 - わだばLisperになる を含むブックマーク はてなブックマーク - 古えのnet.lang.lispからの拾い物 - わだばLisperになる

古いネットニュースをgooglegroupsで眺めていたら、comp.〜になる前の、net.lang.lispが保存されているのを見付けました。

最古のものは、1982年。もう四半世紀前です。

流量も少ないので年間通して読めてしまうのですが、1983年の投稿で、Franz LispのリーダーマクロでUNIXのパイプみたいな書法を考えた!

という投稿が面白そうだったので真似して遊んでみることにしました。

元は、

(print person/mother/father/name/last/car)
;=> (print (car (last (name (father (mother (person)))))))

という風に展開されます。

どうやら、Franz Lispには、中置記法的なものを展開するリーダーマクロの書式/機能があるようなのですが、詳細は不明なのでCLでできそうな風に変更してみました。

#/というリーダーマクロを定義しているのですが、やはりちょっと残念です。

どなたかオリジナルと同じように書ける方法をご存知の方は是非教えて下さい!!

…ちなみに、この書法自体は、あんまり実用的でもなさそうですね(笑)

(defun pipeop (q)
  (labels ((pipeop-n (expr rest)
             (let ((expr (read-from-string expr)))
               `(,@(if (numberp expr)
                       `(nth ,(1- expr))
                       (list expr))
                   ,@(if rest (list rest) rest))))
           (recur (q acc)
             (let* ((cmds (string q))
                    (pos (position #\/ cmds)))
               (if pos
                   (recur (subseq cmds (1+ pos))
                          (pipeop-n (subseq cmds 0 pos) acc))
                   (pipeop-n cmds acc)))))
    (recur q () )))

(set-dispatch-macro-character #\# #\/
                              (lambda (str char arg)
                                (declare (ignore char arg))
                                (pipeop (read str nil nil nil))))

;; 動作
(progn
  #/person/car/father/name/last/1)
;展開 => (PROGN (NTH 0 (LAST (NAME (FATHER (CAR (PERSON)))))))

ゲスト



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