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-02-07

S式だった頃のDylan

| 10:23 | S式だった頃のDylan - わだばLisperになる を含むブックマーク はてなブックマーク - S式だった頃のDylan - わだばLisperになる

Lisp系言語でS式でないものといえば、Dylanが有名ですが、Dylanも当初はS式だったとのこと。

前々からS式だった頃のDylanってどんなものだったのか興味はあったのですが、Googleでも全然ヒットしないし、全く未知のものでした。

そんな今日、暇だったので、CMUのAIレポジトリを眺めていたのですが、Dylanのコーナーがあったのをみつけ、ファイルを漁っていたら、一番最初の古いマニュアルの中のサンプルコードが纏められているファイルをみつけました。

このexample.txtファイルでは、DylanがS式で記述されています。

ぱっと見たところでは、7割Scheme+3割CLOSのような不思議な感じですが、S式が好きな自分にとっては、結構良い感じなのでAlgol風になっちゃったのは非常に残念だったなあと思いました。マクロの仕様が決定したのは、Algol風になってからっぽいですが、Dylanのマクロは衛生的マクロなので、S式だったら、オブジェクト指向が強調されたSchemeって感じになってたんでしょうか。

それでまた全然関係のない方向に脱線していったのですが、当時Dylanにもcondがあって、デフォルト節がelse:ってことになってるのをみつけました。

Dylanでは、else:のような表記は、キーワードになり、Common Lispでいうと、:elseになります。

;; Dylan
(cond ((< new-position old-position)
        "the new position is less")
      ((= new-position old-position)
        "the positions are equal")
      (else: "the new position is greater"))

それで、考えてみれば、Common Lispでもデフォルト節は、非NILだったらなんでも良いので、

;; Common Lisp
(defun fib (n)
  (cond ((< n 2)
	 n)
	(:else
	 (+ (fib (1- n))
	    (fib (- n 2))))))

(defun fib (n)
  (cond ((< n 2)
	 n)
	(:default
	 (+ (fib (1- n))
	    (fib (- n 2))))))

でも大丈夫だなと。

結構ナイスなんじゃないかと思ったので、きっと他にもやってる人がいるに違いないと思い、Google Code Searchでも検索してみました。

予想通り同じことを考えてる人はいて、condに:elseを使ってる人は非常に少数ながら何人か見付けられました、が、しかし、年代が、大体1990年付近のコードばっかりなので、もしかしたら、Dylanの影響なのかもしれないなと、思ったり、思わなかったり。

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

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

今回は、「リストの要素の個数を数える」のがお題ということで、要するに、lengthの作成ですね。

Arcでは、lengthはlenとなっていて、リスト/文字列/テーブルが引数に取れるようです。

;; 動作
(list-len '(foo bar baz))
;=> 3

;; 定義
(def list-len (lst)
  ((afn (lst cnt)
	(if (no lst)
	    cnt
	    (self (cdr lst) (+ cnt 1))))
   lst 0))

;(len '(foo bar baz))
;=> 3