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-04-22

ACL-COMPAT

| 22:47 | ACL-COMPAT - わだばLisperになる を含むブックマーク はてなブックマーク - ACL-COMPAT - わだばLisperになる

毎週火曜は適当にCLのライブラリを紹介することにしてみました。

今回は、ACL-COMPATですが、これは、Flanz社のAllegro CLとのコンパチビリティレイヤを他の処理系にも提供するものです。

元々Allegro CL用に書かれたものが他の処理系に移植される際にこのパッケージが使われることが多いようです。

割と依存しているパッケージが多いので知らない間にインストールされているかもしれません。

パッケージ名ACL-COMPAT
ClikiCLiki: ACL-COMPAT
ASDF-INSTALL

インストール

(asdf-install:install :acl-compat)一発で可能です。

パッケージが提供するもの

  • マルチプロセッシング
  • ソケット
  • ACLのEXCLや、NET.URI、SYSパッケージで定義されている一部ユーティリティ

等々、Allegro風に見せる層を被せるのでAllegroに馴れた人は便利に使える、という感じでしょうか。

自分は、if*の印象しかなかったのですが、改めて眺めてみると結構色々あるなと思いました。

DylanでL-99 (P03 K番目の要素)

| 21:40 | DylanでL-99 (P03 K番目の要素) - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでL-99 (P03 K番目の要素) - わだばLisperになる

DylanでCLのcondに相当するものは、caseで、CLのcaseに相当するものは、selectになります。使い勝手も大体同じ。というか、途中からS式からAlgol表記へ乗り換えた経緯もあり、LISP系でお馴染のものは大体あります。CLをAlgol風に表記しても、多分Dylanみたいになるのでしょう…。

自分は、C/Algol系の言語は殆ど書いたことがなくて、S式系の言語ばかりやっているのですが、Algol記法では

  1. セミコロンの使いどころが把握できない。
  2. リストの要素を一々コンマで区切らないといけないのがしんどい、というかコンマを忘れても気付けない。
  3. 括弧で囲まれていると前置記法として読み書きしてしまうので、if (= x y)等がエラーになってもずっと発見できない。
  4. 括弧の使いどころが分からない。(foo 1 2 3)は、foo(1, 2, 3)と書かれるんだと思いますが、foo 1 2 3としてしまう。

という感じで、良くC/Algol系の人がLISPで遭遇する困難と正反対になっている気がしないでもありません。

そして、この辺の問題は気付けないってのが、非常にストレスに感じます。

この辺は、馴れなんじゃないかなと思いますが、自分のように最初からLISPの割合が高い人間が正反対の性質を持つということは、もしかしたら、「どっちににも馴れる」というのは比較的難しいところで、「どっちか」で落着いてしまうところなのかもしれません。

もちろん、ピアノもギターも弾ける人はいる訳で、訓練次第だとは思いますが、多分、楽器の乗換え位しんどい気がします。

element-at(#(a:, b:, c:, d:), 3)
//=> #"c"

;; Code
module: l99-03

define generic element-at 
    (sequence :: <sequence>, position :: <integer>)
 => (result :: false-or(<symbol>));

define method element-at 
    (sequence :: <list>, position :: <integer>)
 => (result :: false-or(<symbol>))
  case 
    empty?(sequence) => #f;
    1 >= position => head(sequence);
    otherwise => element-at(tail(sequence), position - 1);
  end case
end method element-at;

pfcでL-99 (P03 K番目の要素)

| 02:48 | pfcでL-99 (P03 K番目の要素) - わだばLisperになる を含むブックマーク はてなブックマーク - pfcでL-99 (P03 K番目の要素) - わだばLisperになる

pfcには、condがないようなので、ifの組み合わせで書いてみました。

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

(def (element-at lst k)
  (if (null lst) 
      ()
      (if (>= 1 k)
          (hd lst)
          (element-at (tl lst) (1- k)))))