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

昔のLISPの関数名に記号が使われないのはなぜなのか

| 12:17 | 昔のLISPの関数名に記号が使われないのはなぜなのか - わだばLisperになる を含むブックマーク はてなブックマーク - 昔のLISPの関数名に記号が使われないのはなぜなのか - わだばLisperになる

昔のLISPの関数名(昔といっても、Lisp 1.5の話なのでかなり古いです)は(- 3 2)ではなく、(difference 3 2)と書きました。このように、やたら長いスペルの関数名はあるものの直感的に思い付くような-や+記号というのは、まったく見掛けません。

以前から何でなんだろうなあ、と思っていたのですが、昨日のifや、condのエントリで、M式を書いていて、もしかしたら!という理由を思い付きました。

それは、M式で書くと、

difference[3;2]

と書くのは、まあ普通に見て状況を把握できますが、

-[3;2]

だと、何が何だか良く分からない、ということなんじゃないかなと。

M式以外にも、Eval quoteという表記方法があるんですが、これはトップレベルは、M式のように書くというもの。Lisp 1.5や、INTERLISPで可能な表記形態だったのですが、これも同様に、

difference(3 2)

は良くても

-(3 2)

は何となく変。INTERLISPにも記号で書いた方が完結な長い関数名がずっと残っていましたが、この辺をずっと継承していたからなのではないか?!ということなのですね。

…しかし実際のところ、真相は知る由もございません。

以上、重箱の隅過ぎてトリビアにさえならないネタでした。

ちなみに改めて確認したところ、INTERLISPでは中間記法が使え、その場合は記号が使えました。

ということで、トップレベルでは、

3 - 2

と書くと、1となります。

お馴染のfibはINTERLISPだと

defineq((fib (n)
	     (if (lessp n 2)
	       then
		 n
	       else 
		 (fib n - 1) + (fib n - 2))))

fib(15)
;-> 610

と書けます。

ArcでL-99 (P28a リストを子リストの長さ順で整列)

| 11:55 | ArcでL-99 (P28a リストを子リストの長さ順で整列) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P28a リストを子リストの長さ順で整列) - わだばLisperになる

今回は、リストを子リストの要素数で昇順に整列させるというお題です。

Arcには備え付けでsortがあり、それを使った方が効率が良いとは思うのですが、sortを自作させるのが主旨なんだろうなということで再帰のqsortで書いてみました。

なお、Arcのsortは引数の順番がCommon Lispとは逆のようです。

(lsort '((a b c) (d e) (f g h) (d e) (i j k l) (m n) (o)))
;=> ((o) (d e) (d e) (m n) (a b c) (f g h) (i j k l))

(def lsort (lst)
  (if no.lst
      ()
      (let piv (len car.lst)
	(+ (lsort:rem [<= piv len._] cdr.lst)
	   (list car.lst)
	   (lsort:rem [> piv len._] cdr.lst)))))

;; sort使用
(def lsort (lst)
  (sort (fn (x y) (< (len x) (len y)))
	lst))

QiでL-99 (P04 リストの要素の個数を数える)

| 10:58 | QiでL-99 (P04 リストの要素の個数を数える) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P04 リストの要素の個数を数える) - わだばLisperになる

これまた普通な書き方で。

Qiには備え付けでlengthがあるようです。

(len [1 2 3 4 5 6 7 8])
\-> 8
\

(define len
    [ ] -> 0
    [_ | T] -> (1+ (len T)))

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

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

いまいちQiの流儀というかパターンマッチが分からず、普通のLISPみたいに書いてしまっていますが、これで良いんでしょうかねえ。

(element-at [a b c d e] 3)
\ -> c
\

(define element-at 
    List Pos -> [ ] where (or (< Pos 1) (< (length List) Pos))
    List Pos -> (element-at* List 1 Pos))

(define element-at*
    [ ] _ _ -> [ ]
    [X | _] Cnt Lim -> X where (= Cnt Lim)
    [_ | X] Cnt Lim -> (element-at* X (1+ Cnt) Lim))