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

perl-users.jp

| 18:55 | perl-users.jp - わだばLisperになる を含むブックマーク はてなブックマーク - perl-users.jp - わだばLisperになる

perl-users.jpとか、as-users.jpとか勢いがあるのを眺めると、CLでもそういうのが立ち上がらないかなー、とか思います。

perl-users.jpが立ち上げた動機を読むと、そのままCLにあてはまる気がします。

  • 最新の動向が良く分からない。
  • 初心者への情報はそれなりにウェブ上にあるけれど、中級以降への橋渡し的な情報は極端に少ない。

等々

さらに、CLの場合、

  • 謎の魔術が沢山あるようだけれど、資料が少なかったりして人知れず埋れている。

なんてのもある気がします。

実にもったいない。

しかし、やはり絶対的なユーザ数が少ないせいか、孤高の上級者と、初心者層に分かれていて中級者位の層の情報が薄いという印象もあります。

また、他の言語経験者の方が、興味を持ってCLを試してみたりしても、そういう中級の壁にぶつかって学習意欲が落ちて興味も失なうようなパターンも良く見かける気がしますし、こういうのも実にもったいない。

そしてまた、CLの魅力的なところが、その中級以上位のところの技法だったりすることが多いというのが、また残念。

なんにしろ人が増えないとどうにもならないと思うのですが、鶏と卵ですねー。

LISP引きこもり生活 (9) なんとなくDylan

| 18:19 | LISP引きこもり生活 (9) なんとなくDylan - わだばLisperになる を含むブックマーク はてなブックマーク - LISP引きこもり生活 (9) なんとなくDylan - わだばLisperになる

最近も特にLISP引きこもり生活的には、あまり変化がありませんでした。

というか、CLで身の回りのものを固めるという作業が等閑になっているので、どうしたものかという感じです。

なんでか知りませんが、S式Dylanのマニュアルを眺めて、関数やマクロをCLに移植してみたりしています。

まとまったら、CodeReposにアップしてみたいような気もしますが、何の役にも立たないしやめておいた方が良いような気もします(^^;

LISP1.5でL-99 (P08 連続して現われる要素を圧縮)

| 18:02 | LISP1.5でL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - LISP1.5でL-99 (P08 連続して現われる要素を圧縮) - わだばLisperになる

なんとなくポインタ操作系で。

compress((a a a a b c c a a d e e e e))
; FUNCTION   EVALQUOTE   HAS BEEN ENTERED, ARGUMENTS..
;COMPRESS
;
; ((A A A A B C C A A D E E E E))
;
;
; END OF EVALQUOTE, VALUE IS ..
; (A B C A D E)

DEFINE((
(COMPRESS (LAMBDA (LST)
            (PROG (L RES TEM)
                  (SETQ L LST)
                  (SETQ RES (LIST (GENSYM)))
                  (SETQ TEM RES)
              L   (COND ((NULL L) (RETURN (CDR RES))))
                  (COND ((NOT (EQ (CAR L) (CAR TEM)))
                         (PROG ()
                               (RPLACD TEM (LIST (CAR L)))
                               (SETQ TEM (CDR TEM)))))
                  (SETQ L (CDR L))
                  (GO L))))
))

Getting Started in *LISP (10)

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

2.7 Defining *Lisp Functions and Macros

この章では、関数とマクロをどう定義してゆくかを解説

2.7.1 To Define a Function, Use defun

関数定義には、通常のCLのように、defunが使える

(defun add-mult!! (a b c)
  (*!! (+!! a b) c))

(ppp (ADD-MULT!! 1 2 3) :end 12)
;>>> 9 9 9 9 9 9 9 9 9 9 9 9 
;==> nil

(*defvar my-pvar 1)

(*set my-pvar (add-mult!! my-pvar -6 (self-address!!)))

(ppp my-pvar :end 12)
0 -5 -10 -15 -20 -25 -30 -35 -40 -45 -50 -55 NIL

という風に割とCLのまま書ける。

*Lispには、*defunというものも用意されているが、特殊な状況を除き使用する必要はなく、殆どdefunでまかなえるとのこと。

2.7.2 To Define a Macro, Use defmacro

マクロの定義もお馴染みのdefmacroで定義。

(defmacro *two-incf (pvar)
  `(*set ,pvar (+!! ,pvar 2)))

(*TWO-INCF my-pvar)

(ppp my-pvar :end 12)
;>>> 2 -3 -8 -13 -18 -23 -28 -33 -38 -43 -48 -53
;==> NIL

というようにCLそのままな感じ。

2.8 Compiling *Lisp Code

コンパイルについてもCLと同様で、関数単位、ファイル単位で可能。

(compile 'add-mult!!)

(compile-file "starlisp-code.lisp")
(load "starlisp-code")
  • A Note about Declarations

コンパイラへの宣言については、*Lispでは、関数の引数と返り値の型を完全に明確に宣言しないと、完全にコンパイルされないということに注意せよ、とのこと。

詳細は、5章で解説。

完全な宣言の例

(defun add-mult!! (a b c)
  (declare (type (pvar (signed-byte 32)) a b c))
  (*!! (+!! a b) c))

型宣言しなければ、コンパイルされないわけではなく、パフォーマンス等で機能を十全に発揮させるには、型宣言が必要になることに注意せよ、とのこと。

2.9 Summary: How *Lisp and Common Lisp Are Similar

CLと*Lispの共通点についてのまとめ

  • pvarは、CLのアレイのようなもの
  • pvarのプリティプリントにはpppがある
  • 並列動作する関数は、pvarに対して動作する並列版CL関数ともいうべきもの
  • defunや、defmacro等CLと同じものが使える
  • コンパイラは、*Lisp用に拡張されたCLのコンパイラのようなもの

次回、3章から再開です。

GOOでL-99 (P17 指定した位置でリストを分割)

| 15:32 | GOOでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P17 指定した位置でリストを分割) - わだばLisperになる

GOOには、splitが既に存在しているのですが、Perlのsplitと同じようなもののため、my-splitとして作成。

また、GOOには多値がないのですが、その代わりとしては、タプルを使うことになっていようです。

色々な型に対応するということで、分割した結果をタプルで返すことにしてみました。

seqは、CLのsubseqに相当し、seq*は、(seq x (len seq))と同様の働きをするものです。

(my-split '(a b c d e f g h i k) 3)
;==> #((a b c) (d e f g h i k))

(my-split #(a b c d e f g h i k) 3)
;==> #((a b c) (d e f g h i k))

(my-split #[a b c d e f g h i k] 3)
;==> #(#[a b c] #[d e f g h i k])

(my-split "abcdefghik" 3)
;==> #("abc" "defghik")

(dg my-split (u|<seq> pos|<int> => <seq>))

(dm my-split (u|<seq> pos|<int> => <seq>)
  (tup (sub u 0 pos) (sub* u pos)))

CLOSでL-99 (P23 ランダムに指定した個数を選択)

| 13:08 | CLOSでL-99 (P23 ランダムに指定した個数を選択) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P23 ランダムに指定した個数を選択) - わだばLisperになる

P20で定義したREMOVE-ATを使えとありますが、L-99の元になったP-99では、REMOVE-ATが結果と残りのリストの両方を結果として返すものなので、このお題で使えるということのようです。

ということで、REMOVE-ATを修正して使ってみました。

しかし無駄に長いなあ…。

(rnd-select '(a b c d e f g h) 3)
;=> (G A F)

(rnd-select #(a b c d e f g h) 3)
;=> #(D E G)

(rnd-select "abcdefgh" 3)
;=> "gbc"

(defgeneric RND-SELECT (sequence number)
  (:documentation
"P23 (**) Extract a given number of randomly selected elements from a list.
    The selected items shall be returned in a list." ))

(defmethod RND-SELECT :around ((sequence sequence) (count integer))
  (let ((len (length sequence)))
    (cond ((zerop len) sequence)
          ((or (> 1 count) (< len count)) 
           (MAKE-EMPTY-SEQUENCE sequence))
          ('T (call-next-method sequence count)))))

(defmethod RND-SELECT ((sequence sequence) (count integer))
  (loop :with seq := sequence
        :with res := ()
        :for len := (length seq) :then (1- len) 
        :for i :from count :downto 1 :when (> 1 count) :do (loop-finish)
        :do (multiple-value-bind (s item) (REMOVE-AT seq (1+ (random len)))
              (push item res)
              (setq seq s))
        :finally (return (coerce res (class-of sequence))))))

(defgeneric REMOVE-AT (sequence position)
  (:documentation "P20 (*) Remove the K'th element from a list."))

(defmethod REMOVE-AT ((sequence sequence) (position integer))
  (values (concatenate (class-of sequence)
                       (subseq sequence 0 (1- position)) 
                       (subseq sequence position))
          (elt sequence (1- position))))

(defgeneric make-empty-sequence (obj))
(defmethod make-empty-sequence ((obj list)) 
  () )
(defmethod make-empty-sequence ((obj vector))
  (make-array 0))
(defmethod make-empty-sequence ((obj string))  
  (make-string 0))

ゲスト



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