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

Getting Started in *LISP (6)

| 23:37 | Getting Started in *LISP (6) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (6) - わだばLisperになる

*LISPのチュートリアルを細々とさらっております。今回は、1.2.5章から再開

1.2.5 Personalize Your System

このセクションは作成したプログラムファイルのロードについて等の記述に軽く触れている程度の内容です。

1.3 Exiting From *LISP

*LISPはコネクションマシンに接続されたホストから操作するのですが、ホスト機としては、SUNのUNIXワークステーションや、SymbolicsのLispマシンが対応していました。

ホスト機のLispの処理系は、Lucid Common Lisp、Symbolicsは、Symbolics Common Lisp(だったのかな?)のようです。

面白いのが、Symbolicsの方は、Lispマシンということもあって、終了の方法は、パッケージを移動するだけ、というところ。

UNIXは、最近のCL処理系と同じく(quit)とかしてシェルに抜けます。

次回、第2章から再開で、パラレル変数の扱い等々です。

GOOでL-99 (P13 ランレングス圧縮 その3)

| 06:43 | GOOでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P13 ランレングス圧縮 その3) - わだばLisperになる

WikipediaでDylanの歴史の項目を眺めていたら、GOOの作者であるJonathan Bachrach氏は、Dylanの一番最初のフリーの実装を作った人だったらしく、GOOがDylanから影響を受けているというもの宜なるかな。

supはCLのcall-next-methodのようなもので、与えた引数に次に特定できるクラスのメソッドを適用します。

(encode-direct '(a a a a b c c a a d e e e e))
;=>  ((4 a) b (2 c) (2 a) d (4 e))
(encode-direct #[a a a a b c c a a d e e e e])
;=> #[(4 a) b (2 c) (2 a) d (4 e)]
(encode-direct #(a a a a b c c a a d e e e e))
;=> #((4 a) b (2 c) (2 a) d (4 e))
(encode-direct "aaaabccaadeeee")
;=> "4;a,b,2;c,2;a,d,4;e"

(dg encode-direct (u|<seq> => <seq>))

(dm encode-direct (u|<seq> => <seq>)
  (if (empty? u)
      u
      (let ((cnt 0)
            (prev (elt u 0))
            (res (packer-fab <lst>)))
        (for ((x `(,@(as <lst> u) ,(gensym))))
            (if (= prev x)
                (incf cnt)
                (seq 
                 (pack-in res (if (= 1 cnt) prev `(,cnt ,prev)))
                 (set cnt 1)
                 (set prev x))))
        (as (class-of u) (packed res)))))

(dm encode-direct (u|<str> => <str>)
  (join (map (fun (x) 
               (if (cons? x)
                   (let (((tup num item) x))
                     (cat (to-str num) ";" (to-str item)))
                   (to-str x)))
             (sup (as <lst> u)))
        ","))

(df cons? (u|<any> => <log>)
  (and (subtype? (class-of u) <lst>)
       (not (nul? u))))

LISP引きこもり生活 (5) なんでもCL-USERに取り込めの巻

| 02:28 | LISP引きこもり生活 (5) なんでもCL-USERに取り込めの巻 - わだばLisperになる を含むブックマーク はてなブックマーク - LISP引きこもり生活 (5) なんでもCL-USERに取り込めの巻 - わだばLisperになる

前回から2ヶ月ぶり位になってしまいましたが、「LISP引きこもり生活」はこれから続きものということで毎週水曜日に書こうと思っています!

「LISP引きこもり生活」はCLのイメージからできるだけ外出しないようにする試みです。

前回までは、お世話になったzshなどを放棄し、Lispマシン風にSLIMEからなんでも操作しよう!という流れでした。

この2ヶ月で変ったことといえば、シェル操作(OS操作)でzsh以上の便利さがなかなか実現できず、結局段々zsh様を使うことが増えて来ました(笑)

これではいけないな。CLASHとか導入してみようかな…。

それと、生活用にHOMEパッケージというものを定義してみたのですが、割と中途半端な存在で、これだったら、CL-USERにがんがん自作ユーティリティをつっこんでしまっても良いのではないかと思い、なんでもCL-USERに取り込んで、LISPイメージをダンプするようにしました。

ASDFや、ASDF-INSTALLも、USE-PACKAGEしていますが、ぶつかるものもないので普段の生活にはこっちの方が便利かもしれません。

もともとCL-USERはユーザの為の作業空間な気がするので、少々汚なくなっても良いかなと。

もちろんCLパッケージからエクスポートされている関数の名前をつけかえるようなことはまずいですが…。

なんにしろこういうカスタムイメージは作業するのには非常に便利かなと思います。

LISP1.5でL-99 (P04 リストの長さ)

| 01:37 | LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P04 リストの長さ) - わだばLisperになる

LISP1.5には標準でLENGTHがあるようです。(エミュレータには何故か無いのですが…。)

SIZEは、再帰版で、SIZE-ITERは、ループ版ってことで書いてみました。ちなみに、DEFINEのは一度に複数の定義が書けます。

SIZE((A B C D E F))
SIZE-ITER((A B C D E F))

;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6
;
;  FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
; SIZE-ITER
;
; ((A B C D E F))
;
;
; END OF EVALQUOTE, VALUE IS ..
; 6

DEFINE ((
(SIZE (LAMBDA (LST)
        (COND ((NULL LST) 0)
              (T (ADD1 (SIZE (CDR LST)))))))

(SIZE-ITER (LAMBDA (LST)
             (PROG (L CNT)
                   (SETQ CNT 0)
                   (SETQ L LST)
                L  (COND ((NULL L) (RETURN CNT)))
                   (SETQ CNT (ADD1 CNT))
                   (SETQ L (CDR L))
                   (GO L))))    
    ))

ゲスト



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