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


オブジェクト指向なストリーム

| 12:56 | オブジェクト指向なストリーム - わだばLisperになる を含むブックマーク はてなブックマーク - オブジェクト指向なストリーム - わだばLisperになる

黒田氏の過去のエッセイ?を読みかえしていて、CLに足りないものとして、「オブジェクト指向なストリーム」というのがあったので調べてみる。Gray Streamという奴らしい。名前だけは良く聞くけれど全然使ったことがない。

(defmethod sb-gray:stream-read-line ((stream sb-sys:fd-stream))
  (read-line stream nil :eof))

(defun eofp (input)
  (eq :eof input))

(with-open-file (in "/tmp/foo.txt")
  (loop :for line := (sb-gray:stream-read-line in) :until (eofp line)
        :do (write-line line)))

…いや、この例では全然、旨味が分からない(笑)

ここの例だと、ストリームに出力すると自動でタイムスタンプを付けてくれるというなんだか便利そうな例があるけれど…。

CLOSでL-99 (P15 各要素を任意の回数複製する)

| 12:21 | CLOSでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる

car、cdrではなくて、destructuring-bindを積極的に使ってみる。

&optionalを上手く使えば、パターンの不整合によるエラーも回避できる様子。

今回の例では、destructuring-bindが()を受けることはないので、(&optional head ...)のようなエラー回避はしていません。

(repli '(a b c) 3)
;=> (A A A B B B C C C)

(defgeneric REPLI (lst n-times)
  (:documentation "P15 (**) Replicate the elements of a list a given number of times."))

(defmethod REPLI ((lst null) n-times)
  () )

(defmethod REPLI ((lst cons) n-times)
  (destructuring-bind (head &rest tail) lst
    `(,@(make-list n-times :initial-element head) ,@(REPLI tail n-times))))

QiでL-99 (P15 各要素を任意の回数複製する)

| 12:02 | QiでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P15 各要素を任意の回数複製する) - わだばLisperになる

carとcdrとifの条件分岐で書くより、Qiみたいな書法の方がすっきりして良いと思い始めました。CLでQi風に書けるマクロとか書いてみようかな。

(repli [a b c] 3)
\=> [a a a b b b c c c]
\

(define repli 
  [ ] _ -> [ ]
  [H | T] N -> (append (n-of N H) (repli T N)))

(define n-of 
  N Item -> [ ] where (>= 0 N)
  N Item -> [Item | (n-of (1- N) Item)])

GOOでL-99 (P01 最後のペアを返す)

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

L-99に新しい仲間、Gooが加わりました。

GOOは、SchemeにDylan的なオブジェクト指向を足してArc的なものも加えて、さらにCとの親和性も高くしてみたりしてるような処理系です。

Arcより更に関数名がゴルフな感じになっており、さらにネーミングセンスも作者の嗜好が強いようで割と覚えにくいです。

既にL-99には自分自身食傷気味ですが、少しずつでも常に書いていると、案外色々覚えられるみたいなので(´∀`*)

他に良い問題集ないかしら。

GOOでのリストは普通のLisp系とはちょっと変っていて、常にプロパーリストで、点対リストはないそうです。

(my-last '(a b c d))
;=> (d)

(df my-last (u) 
  (if (nul? (tail u))
      u
      (my-last (tail u))))

Arcのリファレンス

| 10:09 | Arcのリファレンス - わだばLisperになる を含むブックマーク はてなブックマーク - Arcのリファレンス - わだばLisperになる

  • Arcはドキュメントがあまり整備されていないので、どういう関数が用意されているのか、いまいち把握できなかったが、素晴しいリファレンスが登場→Arc: Table of Contents。いままで、make-listが無いと思って自作したりしていたが、お蔭様でn-ofがそれに相当することが判明。

ArcでL-99 (P46 真偽値表)

| 09:25 | ArcでL-99 (P46 真偽値表) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P46 真偽値表) - わだばLisperになる

前回で、算術篇は終わり、今回から論理と符号篇です。ということで、番号が飛んでP46から。 これまでの問題を細かく分けると、43問あるので2問足りてない感じです。 今回のお題は、2引数のand、or、nand、nor、xor、impl、equを定義を定義し、真偽値表を出力するプログラムで結果を表示させるというものです。 implがなんだか良く分かりませんでしたが、検索してみると、IMPLY B (AならばB)のことのようなので、それらしいものを作ってみましたが、これで良いのか自信がありません。
(table t nil *impl)
;=> ====
;   t : t => t
;   t : nil => nil
;   nil : t => t
;   nil : nil => t
;   nil

(def *nand (a b) (no:and a b))
(def *nor (a b) (no:or a b))
(set *and ~*nand)
(set *or ~*nor)
(def *equ (a b) (*or (*and a b) (*and no.a no.b)))
(set *xor  ~*equ)
(def *impl (a b) (*or no.a b))

(def perm (lst)
  ((afn (u res)
     (if no.u
         res
         (self cdr.u `(,@res ,@(map [list car.u _] lst)))))
   lst () ))

(def table (a b f)
  (prn "\n====")
  (each (a b) (perm (list a b))
    (prf "#a : #b => ~ \n" (f a b))))