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-03-27


GOOでL-99 (P03 リストのK番目の要素を取り出す)

| 17:08 | GOOでL-99 (P03 リストのK番目の要素を取り出す) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P03 リストのK番目の要素を取り出す) - わだばLisperになる

GOOはLISP1なのですが、LISP1では、変数名に、関数名と同じものを使うと関数がシャドウされてしまうので、なんだか気持ち悪かったり不便だったりします。

GOOでは、通常のLISPでいうlistは、lstで、エイリアスとして、listも使える、という感じなので、listもlstも変数名として使うには気持ち悪いので、uを使うことにしてみました。

uは、LISP 1.5の時代には、リスト用の変数名としてメジャーだったようです。その流れなのか、スタンフォード大学では、Uや、Vなどが好んで使われていました。

repは、Schemeでいう名前付きletです。

;(element-at '(a b c d e) 3)
;=> c

(dm element-at ((u <lst>) (k <int>))
  (rep loop ((u u) (cnt 1))
    (if (or (= k cnt) (nul? u))
        (head u)
        (loop (tail u) (1+ cnt)))))

;(elt '(a b c d e) 2)
;=> c

妙なダグ名

| 16:38 | 妙なダグ名 - わだばLisperになる を含むブックマーク はてなブックマーク - 妙なダグ名 - わだばLisperになる

Common Lispのような伝統的なLispには、GOTOがある。

飛び先のタグ名には色々な個性があったりするが、一般的には、Lとか、L1とか、Aとか、againとかが多い。

人工知能では有名なSHRDLUはテリー・ウィノグラード氏によりMacLISPで書かれたが、ウィノグラード氏が変り者なのか、妙なタグ名が多いことを今日コードを眺めていて発見した。

(DEFPROP PRINTC
         (LAMBDA (L) (PROG (TEST) 
                           (TERPRI)
                      =>   (COND ((NULL L) (RETURN NIL)))
                           (SETQ TEST (EVAL (CAR L)))
                           (COND ((EQ TEST '<TAB>))
                                 (T (PRINC TEST) (PRINC '/ )))
                           (SETQ L (CDR L))
                           (GO =>)))
         FEXPR) 

さすがに、=>を使うという発想はなかった。

他には、GOが多い。恐らく(GO GO)と書きたかっただけなのではないだろうか。

CLOSでL-99 (P17 指定した位置でリストを分割)

| 15:15 | CLOSでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる

うーん、Qiと同じく、もっとすっきり書けそうな気がするんだけども…。

(split '(1 2 3 4 5 6 7) 3)
;=> ((1 2 3) (4 5 6 7))

(defgeneric split (lst n)
  (:documentation 
   "P17 (*) Split a list into two parts; the length of the first part is given.")
  (:method (lst n) (split1 lst () n)))

(defmethod split1 ((lst null) acc n)
  `(,(reverse acc) ,lst))

(defmethod split1 ((lst cons) acc n)
  (if (> 1 n)
      `(,(reverse acc) ,lst)
      (destructuring-bind (head &rest tail) lst
        (split1 tail (cons head acc) (1- n))))))

QiでL-99 (P17 指定した位置でリストを分割)

| 14:58 | QiでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる

もっと綺麗に書けそうなんだけれども…。

(split [a b c d e f g h i k] 3)
\=> [[a b c] [d e f g h i k]]
\

(define split 
  Lst N -> (split* Lst [ ] N))

(define split* 
  Lst Acc Cnt -> [(reverse Acc) | [Lst]] where (or (empty? Lst) (> 1 Cnt))
  [H | T] Acc Cnt -> (split* T [H | Acc] (1- Cnt)))

一時変数の名前

| 14:48 | 一時変数の名前 - わだばLisperになる を含むブックマーク はてなブックマーク - 一時変数の名前 - わだばLisperになる

変数の名付けにも文化的な側面はあり、例えば、UNIX文化では一時変数はtmpと名付けられることが多いと思う。

では、Lisp界ではどうだったかというと、MacLISPや、Lispマシンではtemという名前が多く、tmpは皆無。