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

UbuntuでCUSP

| 20:31 | UbuntuでCUSP - わだばLisperになる を含むブックマーク はてなブックマーク - UbuntuでCUSP - わだばLisperになる

何度かCUSPはセットアップしては放置を繰り返しているのですが、セットアップの度に忘れるのでメモってみることにしました。

以下、Ubuntu 8.0.4でのセットアップです。

用意するもの、

セットアップ

1. Eclipseを導入

$ sudo apt-get install eclipse

2. CUPSのファイルを展開

$ cd /usr/lib/eclipse
$ sudo tar zxvf /tmp/cusp_linux.tar.gz

3. 展開しただけだと動かないので、features、pluginに中身を展開

$ cd /usr/lib/eclipse/features
$ sudo lndir ../cusp_linux/features

$ cd /usr/lib/eclipse/plugin
$ sudo lndir ../cusp_linux/plugin

4. Eclipse起動

5. Window -> Open Perspective -> Other -> Lisp

完了

はまりどころ

他で、SLIMEが起動していて、4005番のポートが使われていると、ポートが塞がっているのでエラーになる。

機能

プロジェクトを開くと、ASDFのファイルや、パッケージの雛型を一通り準備してくれて便利そうです。

また、SLIMEを横取りして動いているようなものなので、SLIMEの機能は一通りあるようで、コンパイル、マクロの展開、関数名の補完等、必須の所は装備されています。

Eclispeに馴れた人ならば結構良い環境なのではないでしょうか。

参考

  • Windowsでの導入

cadr group

サンプルコードによるLOOPマクロ入門 (3)

| 16:38 | サンプルコードによるLOOPマクロ入門 (3) - わだばLisperになる を含むブックマーク はてなブックマーク - サンプルコードによるLOOPマクロ入門 (3) - わだばLisperになる

値の蓄積

LOOPマクロの実際のコードでは、なんらかの値を蓄積してリスト等にして返すものが多いかと思います。

値を蓄積するキーワードとしては、:collect、:sum、:count〜等色々ありますが、実際に使われるのは、:collectが殆どだと思います。

  • :collect
(loop :repeat 5 
      :collect (random 5)
      :collect 'a
      :collect (random 100)
      :collect 'b
      :collect (gensym))
;=> (2 A 41 B #:G3407 1 A 10 B #:G3408 4 A 13 B #:G3409 4 A 6 B #:G3410 0 A 83
     B #:G3411)

何の役にも立たなそうな例ですが、:collectが複数回使えることを強調してみました。

:repeatが急に登場しましたが、これは、単純に指定した回数だけループを回すというものです。

  • :append
(loop :repeat 5 
      :append (list (random 5) 'a (random 100) 'b (gensym)))

上と同じ結果になるものを:appendで作成してみています。

:appendは、関数のappendから類推できるようにリストを継げて行きます。

そのため:append以下はリストになっている必要があります。

  • :nconc
(loop :repeat 5 
      :nconc (list (random 5) 'a (random 100) 'b (gensym)))

:appendはリストを新規に作成して継げてゆきますが、nconcは、既存のものを破壊的に連結して行きます。

上の例では、新規に作られたリストが連結されて行くので問題ありませんが、

(let* ((foo '((a) (b) (c) (d) (e)))
       (bar (copy-tree foo)))
  (loop :for x :in bar
        :nconc x)
  bar))
;=> ((A B C D E) (B C D E) (C D E) (D E) (E))

のような場合に、元リストが変更されるので、取り扱い注意になります。

数値篇

リスト系の操作の他に、数値を扱う操作もあります。

リストに比べると使用頻度は下がるかと思いますが、数値計算をしている場合には、便利なものが多いかもしれません。

Project Eulerのような問題を解くのには割と便利に使えるような気がします。

  • :maximize
(loop :repeat 5 :maximize (random 100))
;=> 76

値の最大値を返します。

  • :minimize
(loop :repeat 5 :minimize (random 100))
;=> 10

値の最小最大値を返します。

(loop :repeat 5 :sum (random 100))
;=> 231

値の合計を返します。

(loop :repeat 5 :count (oddp (random 100)))
;=> 2

:countに与えられた引数が真の場合をカウントします。