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-09-30

anaphoric-destructuring-bind

| 18:02 | anaphoric-destructuring-bind - わだばLisperになる を含むブックマーク はてなブックマーク - anaphoric-destructuring-bind - わだばLisperになる

quekさん作のwith-car/cdrは、非常にLISP2の特長が生かせた、自分のお気に入りのマクロの一つです。

(with-car/cdr '(1 2 3 4)
  (list car cdr))
;=> (1 (2 3 4))

この路線で行くところまで行くとすると、アナフォリックなdestructuring-bindだろう!、ということで色々考えていたのですが、こういう場合、symbol-macroletを使えば、簡単に作れる気がしたので作ってみました。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (defvar *anaphoras*
    '(car cdr rest first second third forth fifth sixth seventh eighth ninth tenth)))

(defmacro anaphoric-destructuring-bind (list &body body)
  (let ((anaphoras (mapcar (lambda (x) `(,x (,x ,list))) *anaphoras*)))
    `(symbol-macrolet ,anaphoras
       ,@body)))

(let ((foo (list 1 2 3 4)))
  (anaphoric-destructuring-bind foo
    (list (car foo)
          (funcall #'car cdr)
          cdr
          first
          second
          (setq car 'alt)
          foo)))
;=> (1 2 (2 3 4) 1 2 ALT (ALT 2 3 4))

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

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

packの結果を加工せずに直接作成せよという問題。

Clojureのletは分割束縛の機能があるのでリスト分解 & 合成が楽です。

(defn 
  #^{:doc "P13 (**) Run-length encoding of a list (direct solution)."
     :test (do (test= (encode-direct []) [] )
               (test= (encode-direct [1]) [1] )
               (test= (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
; -------------
  ([coll]
     (if (empty? coll)
       []
       (loop [coll (concat coll (list (gensym))),
              tem (list 1 (gensym))
              acc [] ]
         (let [[car & cdr] coll, [cnt item] tem]
           (cond (empty? coll)
                 (rest (reverse acc))
                 ;; 
                 (= car item)
                 (recur cdr (list (+ 1 cnt) car) acc)
                 ;; 
                 :else
                 (recur cdr 
                        (list 1 car)
                        (cons (if (= 1 cnt)
                                item
                                tem)
                              acc))))))))

2008-09-29

9/27第18回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 13:56 | 9/27第18回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 9/27第18回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、9/27 20:00から18回目の勉強会を開催させて頂きました!

発言して頂いた方約11名、observer(ROM)の方約10名前後で、大体20名前後を推移しつつでした。

今回は、akaさんのお題/進行による「CLでのパーシステンス」でした。

良かったところ

akaさんのプレゼンのクオリティが非常に高く非常に有意義な90分となりました(*'-')

ログを読み返してみても非常にためになる内容となりました。

反省と課題

最近ちょっと中身が薄くなって来ていたのですが、akaさんのしっかりと準備された進行を目の当たりにして、やはりしっかりと準備すべきと実感しました。

ログ:

謝辞:

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

ブログでのCL勉強会の紹介ありがとうございます!

ClojureでL-99 (P12 ランレングス圧縮の伸長)

| 11:54 | ClojureでL-99 (P12 ランレングス圧縮の伸長) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P12 ランレングス圧縮の伸長) - わだばLisperになる

repeatという、アイテムの繰り返しの遅延リストを作れるので、こういうのは割と簡潔に書けます。

(defn
  #^{:doc "P12 (**) Decode a run-length encoded list."
     :test (do (test= (decode []) [])
               (test= (decode '((4 a) b (2 c) (2 a) d (4 e)))
                      '(a a a a b c c a a d e e e e))) }
; ------
  decode
; ------
  ([coll]
     (if (empty? coll)
       []
       (mapcat #(if-let [n item] (and (list? %) %)
                  (take n (repeat item))
                  (list %))
               coll))))

2008-09-28

ClojureでL-99 (P11 ランレングス圧縮 その2)

| 14:37 | ClojureでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる

書くのを忘れてましたが、defnに:testを付けると定義した時点で:testの部分が実行されます。

ということで、適切なテストケースを付ければ、きっと便利だと思います。

ただ単にassertだけを書いたテストケースでは、最初に定義した時点で意図通り動かない場合、逆にいらっと来るかもしれません(笑)

また、lengthがないのはなんでだろうと思っていましたが、countという名前で存在していたことを発見。

うーん、確かにcountという名前も妥当ではありますが…。

length、len、size、count等、同じ機能でも方言によって色んな名前がありますね。

(defn
  #^{:doc "P11 (*) Modified run-length encoding."
     :test (do (test= (encode-modified '(a a a a b c c a a d e e e e))
                       '((4 a) b (2 c) (2 a) d (4 e)))
               (test= (encode-modified []) [])
               (test= (encode-modified [1]) [1]))}
; ---------------
  encode-modified
; ---------------
  ([coll]
     (if (empty? coll)
       []
       (map #(if (single? %)
               (first %)
               (list (count %) (first %)))
            (pack coll)))))

(defn single? [coll]
  (nil? (rest coll)))

2008-09-27

seriesの結果が変

| 15:00 | seriesの結果が変 - わだばLisperになる を含むブックマーク はてなブックマーク - seriesの結果が変 - わだばLisperになる

以前から、SERIESで(subseries (series 'b 'c) 0 5)の結果が#Z(LIST B C LIST B)という風に余計なものが混ってしまうのが謎でした。

このLISTってのはなんなのか、新しい仕様なのか?等々色々考えたものの放置していましたが、quekさんの環境では、こういった現象はないとのことで、これは新しい仕様なんかではないことに気付きました(笑)

まず、自分の環境構築の方法がおかしいのかと思って色々な組み合わせで、(asdf-install:install :series)を試してみましたが変化なし。

quekさんは、cl-buildで構築しているとのことで、その辺が鍵かと思って自分もcl-buildを試してみたところ上の例でいえば、#Z(B C B C B)という風に正常な結果を得られるようになりました。

cl-buildでインストールされたもののソースを眺めてみたところ、asdf-installで入手できるソースより新しかったため、最新のソースを求めて、CVS版をインストールしてみたところ、これも正常な結果を得ることができました。

手元の環境は、SBCLですが、このような謎の現象に遭遇された場合は、CVS版の利用をお勧めしたいと思います(といっても自分はバグフィックスのログ等はちゃんと読んでませんが…(^^; )

ClojureでL-99 (P10 ランレングス圧縮)

| 14:25 | ClojureでL-99 (P10 ランレングス圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P10 ランレングス圧縮) - わだばLisperになる

Clojureでは、lambdaは、Arcのようにfn(ファンと作者は読んでいた)と書けるので楽で良いです。

また、リーダーマクロによる更なる略記法もあって、#()でArcの[]のようなことができます。

引数は、UNIXのシェルのように%1、%2、%3...と番号で参照できます。さらに良く使う%1は、%だけでも良し。

(defn
  #^{:doc "P10 (*) Run-length encoding of a list."
     :test (do (test= (encode '(a a a a b c c a a d e e e e))
                      '((4 a) (1 b) (2 c) (2 a) (1 d)(4 e)))
               (test= (encode []) [])) }
; ------
  encode
; ------
  ([coll]
     (if (empty? coll)
       []
       (map #(list (length %) (first %))
            (pack coll)))))

2008-09-26

Clojureでcompact-number-list

| 09:11 | Clojureでcompact-number-list - わだばLisperになる を含むブックマーク はてなブックマーク - Clojureでcompact-number-list - わだばLisperになる

朝のRSSチェックをしていたら、ひげぽんさんのところで、リスト操作のお題が出ていました。

丁度今日やった、L-99の問題にそっくりです。

ということで Scheme どう書く?的 - higepon blogに早速挑戦!

L-99は、27問目まで、こういうリスト操作の問題ばかりなので、こういう問題が好きな方にはL-99がお勧めです!!

(defn 
  #^{:doc "整列済みの number のリストで、'(1 3 4 5 6 12 13 15)
リスト内で数が連続している部分は '(1 2 3) -> '(1 . 3) のように両端のみのリストに纏める。
最初の例のリストであれば以下のようになる。
'(1 (3  6) (12  13) 15)"
     :test (do (test= (group-number-list '(1 3 4 5 6 12 13 15))
                      '(1 (3 6) (12 13) 15))
               (test= (group-number-list []) [] )
               (test= (group-number-list [1 1 1 1 1 1 1]) [1 1 1 1 1 1 1]))}
; -----------------
  group-number-list [coll]
; -----------------  
  (assert (every? number? coll))
  (loop [coll (reverse (cons (gensym) coll)), tem [], acc [] ]
    (let [[car & cdr] coll, [temcar & temcdr] tem]
      (cond (empty? coll) 
            acc
            ;;
            (or (empty? tem)
                (= car (- temcar 1)))
            (recur cdr (cons car tem) acc)
            ;;
            :else
            (recur cdr 
                   (list car)
                   (cons (if temcdr (list temcar (last tem)) temcar)
                         acc))))))

(defmacro test= [expr val]
  `(do (assert (= ~expr ~val))))

ClojureでL-99 (P09 連続して現われる要素を纏める)

| 07:40 | ClojureでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P09 連続して現われる要素を纏める) - わだばLisperになる

なんとなくコメントも付けてみました。どうやら、キーと値のペアなら何でも格納できるようなので、色々活用できるのかもしれません。

(defn
  #^{:doc "P09 (**) Pack consecutive duplicates of list elements into sublists.
If a list contains repeated elements they should be placed in separate sublists."
     :test (do (test= (pack []) [[]])
               (test= (pack [1]) [[1]])
               (test= (pack '(a a a a b c c a a d e e e e))
                      '((a a a a) (b) (c c) (a a) (d) (e e e e))))
     :comment "(pack []) => []とすべきか、(pack []) => [[]]とすべきか…"}
; ----
  pack
; ----
  [coll]
  (loop [coll coll, tem [], acc [] ]
    (let [[car & cdr] coll]
      (cond (empty? coll) 
            (reverse (cons tem acc))
            ;;
            (or (= car (first tem)) (empty? tem))
            (recur cdr (cons car tem) acc)
            ;;
            :else
            (recur cdr (list car) (cons tem acc))))))

(:comment ^#'pack)
;=> "(pack []) => []とすべきか、(pack []) => [[]]とすべきか…"

2008-09-25

ClojureでL-99 (P08 リストの圧縮)

| 04:55 | ClojureでL-99 (P08 リストの圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P08 リストの圧縮) - わだばLisperになる

今回は、letのリストの分割束縛機能を無理矢理気味に使ってみました。テストのところもなんとなくマクロに。

(defn 
  #^{:doc "P08 (**) Eliminate consecutive duplicates of list elements."
     :test (test= (compress '(a a a a b c c a a d e e e e))
                  '(a b c a d e))}
; --------
  compress [coll]
; -------- 
  (loop [coll coll, acc `[~(gensym)] ]
    (let [[head & tail] coll]
      (cond 
       (empty? coll) 
       (rest (reverse acc))
       ;; 
       (= head (first acc))
       (recur tail acc)
       ;; 
       :else 
       (recur tail (cons head acc))))))

(defmacro test= [expr val]
  `(do (assert (= ~expr ~val))))

Clojureでは、,(コンマ)ではなく、~でクオート解除になります。コンマは空白として扱われるので、変数束縛の部分等でみやすく清書するために使えます。

また、ClojureはLISP-1ということもあり、古典的なマクロでは、展開先で内部で使用している関数(マクロ)が書き換えられてしまう問題が心配されますが、これは回避してくれるとのこと。CLのように名前空間も分かれているので(CLのパッケージ的)この点でもScheme+古典的マクロより安全そうです。

(let [= list]
  (= 3 3))
;=> (3 3)

(defmacro foo [x]
  `(= ~x ~x))

(let [= list]
  (foo 3))
;=> true ; 意図した通りの動作

;; scheme (Gauche等)
(define-macro (foo x)
  `(= ,x ,x))

(let ((= list))
  (foo 3))
;=> (3 3) ; 書き換えられてしまいました。

9/27 第18回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 01:49 | 9/27 第18回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 9/27 第18回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

告知が遅くなってしまい、すいません(^^; 今週もCL勉強会は開催させて頂きます!

今回のお題は、ちょっとつっこんだ内容で、パーシステンスについてです。

akaさん発案のお題で、今回は、akaさんが中心となって会を展開して行く予定です。

AllegroCacheについてや、CLでの、DB、シリアライズ等々について議論することになるかと思います。

他の言語との比較議論(JAVAでは、〜だけど、CLだとどうなってるの?というような議論)も有益かと思いますので、CL云々というよりも、パーシステンス一般について一家言ある方も大歓迎です!

場所:Lingr: Common Lisp部屋
日時9/27 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行CLのパーシステンスについて
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までCLでのパーシステンスについてCLで色々書く(書きたい)方-

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

2008-09-24

ClojureでL-99 (P07 リストの平坦化)

| 09:09 | ClojureでL-99 (P07 リストの平坦化) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P07 リストの平坦化) - わだばLisperになる

今回は、テストも付けてみることにしました。

ちょっと探したところでは、解説がみつけられなかったのですが、defnの定義のときに、#^{}という形式で、色々な属性が定義できます。

そして、定義されたものに、逆の符号^#を付ければ、属性のテーブルが呼び出せるようです。

属性のテーブルは、キーワードと値の対になっていて、キーワードは、Clojureの場合、テーブルから値を取得する関数のような動きをするので、ドキュメントならば、

(:doc ^#'flatten)

でflattenのドキュメントが取得できるという具合です。

同じく:testはテスト用の関数を取得でき、

(:test ^#'flatten)

で書いたテストを実行することができます。

なかなか便利なのですが、しかし、色々盛り込むと、関数定義がごちゃごちゃするのが、ちょっと…。

(defn  
  #^{:doc "P07 (**) Flatten a nested list structure."
     :test (assert (and (= (flatten '(1((2)(()3(()()4(((("56")))))))))
                           '(1 2 3 4 "56"))
                        (= (flatten [])
                           [])))}
; -------
  flatten 
; -------
  ([coll]
     (cond (empty? coll) []
           (coll? (first coll))
           (concat (flatten (first coll))
                   (flatten (rest coll)))
           :else (cons (first coll)
                       (flatten (rest coll))))))

2008-09-23

Shibuya.lisp テクニカルトーク#1 開催!!

| 03:25 | Shibuya.lisp テクニカルトーク#1 開催!! - わだばLisperになる を含むブックマーク はてなブックマーク - Shibuya.lisp テクニカルトーク#1 開催!! - わだばLisperになる

10/18(土) 16:00(15:30開場)からに Shibuya.lisp テクニカルトーク#1 開催することが決定しました!

告知ページは、

です。

現在、ライトニングトーク(内容5分)の募集中ですので、是非応募してみてはいかがでしょう!!

2008-09-22

ClojureでL-99 (P06 回文の判定)

| 20:34 | ClojureでL-99 (P06 回文の判定) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P06 回文の判定) - わだばLisperになる

CLのような順番でドキュメントを付けることもできるようです。ただこの場合、ボディ部を括弧で囲まないと上手くSLIMEのドキュメント表示にひっかかってこないという謎。

ちなみに、Clojureは引数/ボディの書き方が複数あるようですが、どれが標準なんだろうという…。

(defn palindrome? 
  "P06 (*) Find out whether a list is a palindrome.
A palindrome can be read forward or backward; e.g. (x a m a x)."
  ([coll]
     (= (seq coll) (reverse coll))))

(palindrome? "たけやぶ")
;=> false
(palindrome? "たけやぶやけた")
;=> true
(palindrome? '[x a m a x])
;=> true

ClojureでSLIME その2

| 19:54 | ClojureでSLIME その2 - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでSLIME その2 - わだばLisperになる

自分は、SLIMEはEMACS内からSWANKを起動するのではなく、SWANKは別に起動して、slime-connectで接続して使っています。

配布のままのswank-clojureだと、EMACS内で起動するようになっているので、slime-connectで接続できるよう、別にSWANKを起動するような起動スクリプトを書いてみました。

Clojure側で準備して、シェルスクリプトで起動させます。

$ swank-clojure
Swank port =>  9696
Clojure
...
#!/bin/sh
#
# swank-clojure

CLOJURE_HOME=~/Desktop/Clojure

cd $CLOJURE_HOME
#java -cp clojure.jar clojure.lang.Repl
java -jar $CLOJURE_HOME/clojure.jar $CLOJURE_HOME/swankd.clj
SWANKサーバ起動
;;;;
;;;; SWANKD
;;;;
;;;; swankd.clj

;; swank-clojureの場所をfile...に指定します。
(clojure/add-classpath "file:////u/mc/Desktop/Clojure/jochu-swank/")
(clojure/require 'swank)

;; いらない?
(swank/ignore-protocol-version "2008-09-14")

(in-ns 'swank)
(defn swankd [port]
  (setup-server port 
                (fn [x] (println "Swank port => " port))
                connection-serve))
  
;; start!
(in-ns 'user)
;; ポートは好きな空いてるとこを…
(swank/swankd 9696)

2008-09-21

ClojureでL-99 (P05 コレクションの逆転)

| 21:35 | ClojureでL-99 (P05 コレクションの逆転) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P05 コレクションの逆転) - わだばLisperになる

ドキュメントを付けてみました。他にユーザコメントとテストが付けられるようです。

;; P05 (*) Reverse a list.
(defn 
  #^{:doc "P05 (*) Reverse a list."}
  rev [coll]
  (let [str? (string? coll)]
    (loop [coll coll, acc []]
      (if (empty? coll)
        (if str?
          (apply str acc)
          acc)
        (recur (rest coll) (cons (first coll) acc))))))

(rev "foooo")
;=> "oooof"
(rev '[f o o o])
;=> (o o o f)

ClojureでL-99 (P04 リストの長さ)

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

lengthが標準ではないようなのですが、もしかすると無限リストの存在と関係があったりするんでしょうか。

;;P04 (*) Find the number of elements of a list.

(defn length [coll]
  (loop [coll coll, acc 0]
    (if (empty? coll)
      acc
      (recur (rest coll) (+ 1 acc)))))

(length "いろはにほ")
;=> 5
;; これでは無限リストじゃ止まらない。

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

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

;; P03 (*) Find the K'th element of a list.

(defn element-at [coll pos]
  (loop [coll coll, pos pos]
    (if (>= 1 pos)
      (first coll)
      (recur (rest coll) (- pos 1)))))

(element-at "いろはにほ" 3)

;=> \は

ClojureでSLIME

| 20:32 | ClojureでSLIME - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでSLIME - わだばLisperになる

開発環境の設定は、Clojureのチュートリアルにも書いてあり、なんとClojure用のSLIMEまであります(*'-')

しかし、どうも更新が激しいらしく、どれを参照して良いものやら、という感じで、実際、上のチュートリアルの通りにしても動かないので今日現在で動く設定を晒してみることにしました。

恐らく、SLIMEもCVS版推奨という感じなのではないかと思います。

run-clojureというコマンドが定義してあるので、これでSLIMEが起動します。

SLIMEの具合ですが、引数の表示、マクロ展開、関数名補完、インスペクタ、ドキュンメントストリングの参照(C-c C-d d)を初めとして普段使いそうな機能は大体動きます。

ということで、CLは嫌いだけど、SLIMEは体験してみたいという向きにもお勧めかもしれません。

#!/bin/sh

#Clojureの置き場所
CLOJURE_HOME=~/Desktop/Clojure

cd $CLOJURE_HOME
java -jar $CLOJURE_HOME/clojure.jar $*
;;;;
;;;; Clojure mode
;;;;
;;;; (require 'cl)してないと動かないw

;; clojure-modeの置き場所
(pushnew "p/a/t/h" load-path)
(require 'clojure-mode)
 
;;;;
;;;; Setup slime
;;;;
;;;;(pushnew "c:/dev/cvstree/slime.cvs" load-path)
;;;; slimeは既に他で設定してある。
 
(setf slime-lisp-implementations
      ;; clojure-initじゃなくて、swank-clojure-initに変更になっていた。
      '((clojure ("~/bin/clojure") :init swank-clojure-init) 
                ))

(require 'slime-autoloads)
;; slime-scratch有効にしてるけど、上手く動かない…。
(slime-setup '(slime-scratch slime-editing-commands))

;; clojure-swankの場所
(pushnew  "/p/a/t/h" load-path)
(require 'swank-clojure)
 
(defun run-clojure ()
  "Starts clojure in slime"
  (interactive)
  (slime 'clojure))

9/20第17回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 19:00 | 9/20第17回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 9/20第17回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、9/20 20:00から17回目の勉強会を開催させて頂きました!

発言して頂いた方約14名、observer(ROM)の方約10名前後で、大体24名前後を推移しつつでした。

今週もShibuya.lispのお蔭様か人が多かったような気がします(*'-')

今回のお題は、参加者の環境構築状況を報告し合うというもので、私(g000001)、NANRIさん、onjoさん、quekさんの順に説明をしつつ、参加者と質疑応答という感じでした。

onjoさんは、Google Presentationでの説明とありということで、力作のご提供ありがとうございます!

反省と課題

予め、準備することを強調して告知していなかったため、説明を準備している方が4人という状況でした。

今回に限っては、初回ということもあり、ほぼ説明が重複することもないので丁度ではありましたが、事前にもう少し詳しく参加方法を説明すべきでした。

発表資料

「Common Lisp 環境紹介 for Windows」onjoさん

まとめBlogエントリ

letter: [Common Lisp] 開発環境」quekさん

ログ:

謝辞:

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

屋上屋

| 18:42 | 屋上屋 - わだばLisperになる を含むブックマーク はてなブックマーク - 屋上屋 - わだばLisperになる

(=
 (funcall #'funcall #'funcall #'+ 1 2 3 4)
 (apply #'apply #'+ 1 2 3 4 () ())
 (apply #'apply #'apply #'+ 1 2 3 4 () () ())
 (apply #'apply #'apply #'+ '(1 2 3 4) () ())
 (apply #'apply #'apply #'+ '((1 2 3 4)) ())
 (apply #'apply #'apply #'+ '(((1 2 3 4))))
 (apply #'apply #'apply #'funcall `(((,#'+ 1 2 3 4)))))
;=> T

2008-09-18

ClojureでL-99 (P2 最後2つのペアを返す)

| 23:55 | ClojureでL-99 (P2 最後2つのペアを返す) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P2 最後2つのペアを返す) - わだばLisperになる

今日もClojureでL-99。小さいコードをいじってると心が休まります(´▽`*)

Clojureでは、()とnilは別物で、()はempty?で検査できます。

また、(rest ())はエラーではなくて、nilが返ります。

ブール値は、trueとfalseなので、別にnilがある、ということなんですね。これはこれで便利かも。

;; P02 (*) Find the last but one box of a list.

(apply str (last-2 "こんにちは"))
;=> "ちは"

(defn last-2 [col]
  (loop [col col]
    (if (nil? (rrest col))
      col
      (recur (rest col)))))
  • CLや、Schemeと違うところ
(nil? ())
;=> false

(nil? nil)
;=> true

(rest ())
;=> nil

2008-09-17

ClojureでL-99 (P1 最後のペアを返す)

| 23:58 | ClojureでL-99 (P1 最後のペアを返す) - わだばLisperになる を含むブックマーク はてなブックマーク - ClojureでL-99 (P1 最後のペアを返す) - わだばLisperになる

最近どうも鬱々として不調なのですが、なんでだろうと内省したところ、これはどうもL-99をやってないからじゃないかという結論に達しました。

ということで、今日からリハビリの為に、ClojureでL-99を開始しようかと。

いい加減 問50以降も挑戦しないととは思いますが、P1からで…。

さっと眺めただけでも、Clojureには色々面白そうな特徴があるようです。これは面白そう。

(defn my-last [col]
  (if (empty? (rest col))
    col
    (my-last (rest col))))

;; 動作例
(my-last '(1 2 3 4))
;=> (4)
(my-last [1 2 3 4])
;=> (4)
(my-last "1234")
;=> (\4)

;; デフォルトだと末尾再帰の最適化はしてくれないそうなので、
;; 用意された構文で書く必要があるらしい。
(defn my-last [col]
  (loop [col col]
    (if (empty? (rest col))
      col
      (recur (rest col)))))
;; とか

面白いとおもったところ

  • cadr、cadddrに似た合成された関数名

first + rest => frest つまり、second

(frest [1 2 3 4])
(frest [1 2 3 4])
;=> 2
(rrest [1 2 3 4])
;=> (3 4)
  • 文字列もリストみたいに扱える
(apply str (rrest "お前誰?"))
;=> "誰?"

;; repeatは無限リストを生成し、takeで最初の10個を
;; 取得、つまり遅延リスト
(apply str \う \は (take 10 (repeat \w)))
;=> "うはwwwwwwwwww"

2008-09-15

9/20 第17回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 00:59 | 9/20 第17回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 9/20 第17回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

今週もCL勉強会は開催させて頂きます!

今回はちょっと毛色が変って、CLの開発環境について各自環境を説明し合ってみることにしました。

  • OS周り
  • ライブラリの整備
  • コアイメージ作成
  • SLIMEや、Emacsの設定
  • ドキュメント参照方法
  • どんな感じの開発サイクルか

といったところでしょうか。

お互いに手の内を教え合うことによって、知らなかった便利なツールが共有できるかもしれません!

場所:Lingr: Common Lisp部屋
日時9/20 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行各自が開発環境をどのように構築しているかを説明し合います
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までCLの開発環境についてCLで色々書く(書きたい)方-

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

2008-09-14

9/13第16回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 18:41 | 9/13第16回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 9/13第16回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、9/13 20:00から16回目の勉強会を開催させて頂きました!

発言して頂いた方約13名、observer(ROM)の方約7名前後で、大体21名前後を推移しつつでした。

Shibuya.lispのお蔭様か何となく人が多かったような気がします(*'-')

とりあえず、今回のお題は、cl-cookbookよりマクロ篇でした。

反省と課題

後半が結構面白いところだったのですが、自分も良く分かっていなかったため、詳しく解説できませんでした。

最後のマクロの例は是非動かしたいところです。

ログ:

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-09-12

EusLispを試してみよう!

| 14:26 | EusLispを試してみよう! - わだばLisperになる を含むブックマーク はてなブックマーク - EusLispを試してみよう! - わだばLisperになる

先日のShibuya.lispの決起集会の後の飲み会で、garaemonさんに、EusLisp(ユースリスプ)というのを教えてもらいました。

EusLispとは、主にロボット制御のためのオジェクト指向LISPとのことです。

詳細は

に書いてあります。

処理系の配布元がリンク切れしているとのことだったのですが、今日garaemonさんのページ:no titleを覗いてみたら

リンク切れしてるが,ftp:// -> http://www.etl.go.jp/とすることでダウンロードできる

とのことだったので、早速no titleのページからダウンロードして試してみました。

自分の、環境は、Ubuntu 8 x86_64です。

コンパイルしようとも思いましたが、色々壁にぶつかりそうだったので、とりあえずコンパイル済みのものを動かしてみました。(要32ビットバイナリが動く環境:ia32-libs)

マニュアルを眺めると色々面白そうな機能があります。

大体のところは、CL系の処理系なようです。

とりあえず馬鹿の一つ覚えで、fib

(defun fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

(fib 10)
;=> 55

CLそのまんまですね(*'-')

コンパイルしてみる

(compile 'fib)

compiling file: eus2060C58.l
gcc -c -Di386 -DLinux -w -DGCC  -fpic  -I/u/mc/prog-ubuntu/Desktop/EusLisp/eus/include -O eus2060C58.c; ld -shared -o eus2060C58.so eus2060C58.o
;; binloading ./eus2060C58.o into #<package #X8199f4c USER>
BINLOAD cannot dlopen: ./eus2060C58.o: wrong ELF class: ELFCLASS64
;; binloading /u/mc/prog-ubuntu/Desktop/EusLisp/eus/eus2060C58.o into #<package #X8199f4c USER>
BINLOAD cannot dlopen: /u/mc/prog-ubuntu/Desktop/EusLisp/eus/eus2060C58.o: wrong ELF class: ELFCLASS64
;=> 環境が64bitのためかエラー

という風にCに変換してgccでコンパイルされる様子。これは32bit環境なら行けそうです。

オジェクト指向なプログラミング

EusLispはCLOS系ではなくて、どうも元祖FlavorsのようなSmalltalk的なメッセージパッシングスタイルみたいで、Flavorsのようにsendという構文がありました。

適当なクラス作成
(defclass foo 
  :slots (x))
これまた適当にメソッド作成
(defmethod foo 
  (:foo ()
   (print "foo!"))
  (:bar ()
   (print "bar!")))

面白いのは、defmethodで複数のセレクタを定義できるところで、なんというか、CLOSのdefgenericとFlavorsのdefmethodを足して2で割った感じです(*'-')

(send (make-instance foo) :foo)
;=> "foo!"
(send (make-instance foo) :bar)
;=> "bar!"

みたいに動作します。

これは面白いかも!

2008-09-10

9/13 第16回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 09:10 | 9/13 第16回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 9/13 第16回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

今週もCL勉強会は開催させて頂きます!

今回は、cl-cookbookより

  1. Macros and Backquote

です。

多分、Macros and Backquoteで90分使う感じと予想しています。

もし時間が余れば、マクロについての補助的な教材の案内や、議論で埋められるかと思います。

割とマクロについての話題は豊富かと思いますので…。

場所:Lingr: Common Lisp部屋
日時9/6 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までThe Common Lisp Cookbook(Macros and Backquote)CLで色々書く(書きたい)方The Common Lisp Cookbook - Macros and Backquote

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

2008-09-08

Shibuya.lisp発足!!

| 15:00 | Shibuya.lisp発足!! - わだばLisperになる を含むブックマーク はてなブックマーク - Shibuya.lisp発足!! - わだばLisperになる

Shibuya.pmを手本にした、Lisp系言語のコミュニティShibuya.lispが発足しました。

発起人のhigeponさんが、9/5 20:37にIRCでコミュニティの立ち上げについてをつぶやいてから約66時間後の発足ということで実に素早い発足でした!

また、この度、自分も発起人のサポートという形で参加させて頂くことになりました(*'-')

メインのサイトはこちらです。

MLはこちらです。

自分は、ひきこもっているということもありますので、地域に限定されないオンライン的活動の重要性も常に訴えて行きたいです(笑)

とりあえず、東京の渋谷周辺半径2万キロですが、該当する方もしない方も是非参加してみてはいかがでしょうか!

ひげぽんさんの発足発表:

2008-09-07

9/6第15回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ

| 20:05 | 9/6第15回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる を含むブックマーク はてなブックマーク - 9/6第15回慢性的CL勉強会@Lingr 8時だョ!全員集合まとめ - わだばLisperになる

昨日、9/6 20:00から15回目の勉強会を開催させて頂きました!

発言して頂いた方約9名、observer(ROM)の方約11名前後で、大体20名前後を推移しつつでした。

今回Shibuya.lispの発足の会議があり、途中から、そちらと合流しようという流れだったためか、参加者が多かったようです。

とりあえず、今回のお題は、cl-cookbookよりファイル篇とパッケージ篇。

反省と課題

ファイル篇はまあまあでしたが、パッケージ篇が割とスカスカに。

Cookbookの内容が未完ということもあるので、別途何か他の資料をお題にして再度チャレンジしたいです。

ログ:

謝辞

ページへの勉強会のロゴ設置ありがとうございます!

よりドリフっぽくなっててびっくりしました(*'-')

今回も勉強会の一員に加えて頂いてありがとうございます!

2008-09-04

Let Over Lambda読書会@はてなハイク

| 05:53 | Let Over Lambda読書会@はてなハイク - わだばLisperになる を含むブックマーク はてなブックマーク - Let Over Lambda読書会@はてなハイク - わだばLisperになる

Let Over Lambda(LOL)をAmazonで購入したのでLOL読書会@はてなハイクも開始してみることにしました。

LOLはDoug Hoyte氏が著したOn Lispの方向性を推し進めたマクロの書です。

太っ腹なことに4章までは、オンラインで読むことが可能です。自分は、Amazonから本が到着するまでオンラインで読み進めたいと思っています。

とりあえず、場所は、

です。

割と妙な間違いを書いてると思いますので、是非ツッコミお待ちしておりますー。

2008-09-02

9/6 第15回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知

| 23:31 | 9/6 第15回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる を含むブックマーク はてなブックマーク - 9/6 第15回 慢性的CL勉強会@Lingr 8時だョ!全員集合 告知 - わだばLisperになる

来週もCL勉強会は開催させて頂きます!

今回は、cl-cookbookより

  1. Files and Directories
  2. Packages
  3. Macros and Backquote

です。

Macros and Backquote以外は短かくて各20分位、残りの時間をMacros and Backquoteで使うという感じになるかなと予想しています。

場所:Lingr: Common Lisp部屋
日時9/6 (土) 20:00から適当(途中参加/離脱/ROM歓迎)
勉強会の進行テキストを最初から参加者が眺めてゆき、質問があったり、議論になりそうなことがあったら議論してゆきます。
勉強会の目標CLに関して一つ位賢くなった気になること
時刻お題対象者参考リンク
20:00-21:30位までThe Common Lisp Cookbook(Files and Directories〜Macros and Backquote)CLで色々書く(書きたい)方The Common Lisp Cookbook - Files and Directories

勉強会のネタがあれば、このブログにコメント頂くか、Lingr等に書き置きしてみて下さい。好きなテーマを持ち込んでみて頂くというのも大歓迎です!

ACL読書会@はてなハイク(17.5 loopの機能)

| 20:56 | ACL読書会@はてなハイク(17.5 loopの機能) - わだばLisperになる を含むブックマーク はてなブックマーク - ACL読書会@はてなハイク(17.5 loopの機能) - わだばLisperになる

とりあえず、アンチloopマクロ派のPGが説明するloopマクロのセクションを読んでみることにしました。

一人だとブログに書くのと変わりませんが、レスが付くと良い感じに展開して行くんでしょうか。…謎です(笑)

スレッドごとに表示されないので、ちょっとみづらいかも…。

次の内容はレスとして表示されるので、読み終ったらレスのアイコンをクリックして進むことになります。

ツッコミを入れたい場合は、Replyを押してレスを書きます。

2008-09-01

ANSI Common Lisp読書会@はてなハイク

| 23:50 | ANSI Common Lisp読書会@はてなハイク - わだばLisperになる を含むブックマーク はてなブックマーク - ANSI Common Lisp読書会@はてなハイク - わだばLisperになる

毎週土曜のCL勉強会で、ANSI Common Lispの読書会とかできたら良いねェというような話は何回か話題になったりはしているのですが、具体的にどういうふうに開催するかというところで毎度行き止まりとなっていました。

基本引きこもりの自分としては、ここは一つオンラインの可能性を追及したいというということで、はなてハイク上で読書会を展開してみることにしてみました。

どうして、はてなハイクなのかというと

  1. RSSリーダーで確認できる
  2. エントリにレスができる
  3. 簡単に分岐できそう

というところです。Wassrでも良かったのですが、Wassrのチャンネルでは現状ではレスができないのと、分岐するにはチャンネルを作ることになるので、ちょっと抵抗感があるかな、といったところです。

現状ほぼノープランですが、想定しているところとしては、

  1. 以前から疑問に思っていたところを、試しに投下して釣れるのを待つ
  2. 章ごとにキーワードを新しく作って、最初から読み進めて行く
  3. 個人的なしおりの代わり

とか、色々柔軟に展開かもしれないなと思っています。

ちなみにこれまでのオンラインでのCL勉強会ですが、参加者さんのお住いの分布状況からすると割と散らばっているので、それなりにオンラインのメリットは打ち出せているようです。

とりあえず、場所は、

です。

もし興味がありましたら、是非のぞいてみてくださいー。

上手く行くようだったら、Let Over Lambda読書会とかやろうと思っています(笑)

…まだ自分は、LOL買ってないですが…。