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-01-17

どう書く〜#` リーダーマクロ〜 結果

15:09 | どう書く〜#` リーダーマクロ〜 結果 - わだばLisperになる を含むブックマーク はてなブックマーク - どう書く〜#` リーダーマクロ〜 結果 - わだばLisperになる

気がつけば、「どう書く〜#` リーダーマクロ〜 - わだばLisperになる - cadr group」というお題を出してから10日以上経過してしまいました。

ちょっとマニアック過ぎて誰にも興味を持ってもらえないと思ったのですが、発表からすぐにkozimaさんに解答をブログエントリにして頂けました!

ありがとうございます!

お題を出しておいてなんなんですが、このお題は自分には難しく、ネストした表現は無理で途中で座礁してしまったのですが、晒さない訳にもいかないので恥を晒しておきます(笑)

(defun car-safe (obj)
  (if (consp obj) (car obj) obj))

(let ((*readtable* (copy-readtable nil)))
  (set-macro-character #\, 
    (lambda (str char)
      (declare (ignore char))
      `(comma ,(read str nil nil T))))
  (set-dispatch-macro-character #\# #\`
    (lambda (str char arg)
      (declare (ignore arg char))
      (let ((form (read str nil nil T)))
        (let ((pos (position 'comma form :key #'car-safe)))
          (append  (list 'progn)
                   (mapcar (lambda (x)
                             (append (subseq form 0 pos) x))
                           (apply #'mapcar #'list 
                                  (mapcar #'cadr (subseq form  pos)))))))))
  (map nil #'pprint 
       (list (read-from-string "#`(print ,(1 2 3))")
             (read-from-string "#`(send stream ,(:clear-input :clear-output))")
             (read-from-string "#`(rename-file ,(\"foo\" \"bar\") ,(\"ofoo\" \"obar\"))"))))

;-> (PROGN (PRINT 1) (PRINT 2) (PRINT 3))
;   (PROGN (SEND STREAM :CLEAR-INPUT) (SEND STREAM :CLEAR-OUTPUT))
;   (PROGN (RENAME-FILE "foo" "ofoo") (RENAME-FILE "bar" "obar"))
;=>NIL