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-20

mapf私の解答

| 00:47 | mapf私の解答 - わだばLisperになる を含むブックマーク はてなブックマーク - mapf私の解答 - わだばLisperになる

割と無茶な感じなのですが、がんばってみました。ひどいです(笑)

catchとthrowをgensymにしていますが、これはコンパイルした場合にタグ名の競合は回避できるのでしょうかという謎。

(eq '#:foo '#:foo)
;=> NIL
(eq #0='#:foo #0#)
;=> T

という感じなので大丈夫なのかしら。

--

1. onjoさん(lispuser.net)にも挑戦して頂けました!

流石、綺麗な解答です(*'-')

2. quekさんにも挑戦して頂けました!

なるほど!、catch/throwを使わなくても解けるという例ですね。

3. youzさんの解答

これもすっきり纏まっていて素晴らしい!

皆それぞれ面白いですねー。GOとか関数跨いでTHROWしてるのは私だけでした(笑)

--

;; g000001の苦戦
(progn
  (defun mapleave (&optional vals)
    (throw '#0=(gensym "MAPFLEAVE-") vals))
  
  (defun mapstop (&rest vals)
    (throw '#1=(gensym "MAPSTOP-") (copy-list vals)))
  
  (defun mapret (&rest vals)
    (throw '#2=(gensym "MAPRET-") (copy-list vals)))
  
  (defun mapf (finalf loopf &rest lists)
    ;; mapleave
    (catch '#0#
      (prog* ((lists (copy-tree lists)) 
              (len (length lists))
              (ans (list :ans))
              (tem ans))
       :top  (when (some #'endp lists) (go :fin))
             (progn
               ;; mapstop
               (setf (cdr tem)
                     (catch '#1#
                       ;; mapret
                       (setf (cdr tem)
                             (catch '#2#
                               ;; nomal
                               (setf (cdr tem)
                                     (list
                                      (apply loopf (and lists 
                                                        (mapcar #'car lists)))))
                               (or finalf (go :esc)) ;finalf?
                               (setf tem (cdr tem))
                               (go :esc)))
                       (setf tem (last tem))
                       (go :esc)))
               (setf tem (last tem))
               (go :fin))
       :esc  (dotimes (i len) (pop (nth i lists)))
             (go :top)
       :fin  (return (and finalf (apply finalf (cdr ans))))))))

ゲスト



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