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

CLOSでL-99 (P16 周期Nで要素を間引く)

| 19:39 | CLOSでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる を含むブックマーク はてなブックマーク - CLOSでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる

まったくもってCLOSの勉強にはなっていないのですが、ややこしい総称関数の引数の書法くらいは覚えられるかも知れない(笑)

(drop '(a b c d e f g h i k) 3)
;=> (A B D E G H K)

(defgeneric DROP (lst n)
  (:documentation 
   "P17 (*) Split a list into two parts; the length of the first part is given.")
  (:method (lst n) (drop1 lst n n)))

(defmethod DROP1 ((lst null) n cnt)
  () )

(defmethod DROP1 ((lst cons) n (cnt (eql 1)))
  (DROP1 (cdr lst) n n))

(defmethod DROP1 ((lst cons) n cnt)
  (destructuring-bind (head . tail) lst
    (cons head (DROP1 tail n (1- cnt)))))

QiでL-99 (P16 周期Nで要素を間引く)

| 19:16 | QiでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる を含むブックマーク はてなブックマーク - QiでL-99 (P16 周期Nで要素を間引く) - わだばLisperになる

いくらなんでも、L-99ばっかりやり過ぎな気がしてきた(笑)

\(drop [a b c d e f g h i k] 3)
\=> [a b d e g h k]

(define drop
  X N -> (drop* X N 1))

(define drop* 
  [ ] _ _ -> [ ]
  [H | T] N Cnt -> (drop* T N 1) where (= N Cnt)
  [H | T] N Cnt -> [H | (drop* T N (1+ Cnt))])

Common LispでL-99 (P47 真偽値表 その2)

| 18:40 | Common LispでL-99 (P47 真偽値表 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - Common LispでL-99 (P47 真偽値表 その2) - わだばLisperになる

Common Lispで挑戦していたときには、中間記法に直すのが面倒臭くて、解答を作ってなかったことに気付いたので、Common Lisp版も作成。

いまいちtableの引数の扱いが不明。この辺は、PrologとLispの違いという感じもしたり、しなかったり。

(table/b ((A t) (B nil))
  A and (A or not B))
;=> T : T => T
;   T : NIL => T
;   NIL : T => NIL
;   NIL : NIL => NIL

(defmacro TABLE/B ((a b) &body expr)
  `(LET (,a ,b)
     (DOLIST (X (PERM (LIST ,(car a) ,(car b))))
       (DESTRUCTURING-BIND (A B) x
         (FORMAT T "~A : ~A => ~A~%" a b ,(to-prefix expr))))))

(defun TO-PREFIX (expr)
  (labels ((frob (expr)
             (cond ((atom expr) expr)
                   ((and (consp expr) (eq 'not (car expr))) 
                    (if (consp (cadr expr))
                        `(not ,(frob (cadr expr)))
                        expr))
                   ((atom (car expr))
                    (destructuring-bind (a pred b) expr
                      `(,pred ,a ,(frob b))))
                   ('T (destructuring-bind (a pred b) expr
                         `(,pred ,(frob a) ,(frob b)))))))
    (frob (conjunct-not-expr expr))))

(defun CONJUNCT-NOT-EXPR (expr)
  (cond ((null expr) () )
        ((eq 'not (car expr))
         `((not ,(if (atom (cadr expr))
                     (cadr expr)
                     (CONJUNCT-NOT-EXPR (cadr expr))))
           ,@(CONJUNCT-NOT-EXPR (cddr expr))))
        ((atom (car expr))
         (cons (car expr) (CONJUNCT-NOT-EXPR (cdr expr))))
        ('T (cons (CONJUNCT-NOT-EXPR (car expr))
                  (CONJUNCT-NOT-EXPR (cdr expr))))))
;

Franz Lisp

| 17:55 | Franz Lisp - わだばLisperになる を含むブックマーク はてなブックマーク - Franz Lisp - わだばLisperになる

Franz Lispを試してみたくて、4.3BSDをSIMHで動かす。

4.3BSDは、ディスクイメージを配布しているところがあるので、それなりに簡単に動いたが、外部とのファイル交換の方法が良く分からない、ネットワーク接続も大義だし。

テープデバイスからtarのイメージを読み込めないか試してみたがフォーマットが違う様子。

ファイルが取り込めさえすれば、Franz Lispがmakeできると思うんだけれど…。

GOOでL-99 (P02 最後から2つのペアを返す)

| 17:49 | GOOでL-99 (P02 最後から2つのペアを返す) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P02 最後から2つのペアを返す) - わだばLisperになる

GOOはDylanに結構影響を受けているようで、オブジェクト指向なところは、Dylanっぽい様子。

Dylanっぽいということは、CLOSっぽいということでもありますが、GOOにも総称関数があり、どうやら積極的に使うようなので、基本的に総称関数を使うことにしてみました。

dm→define methodの略のようです。

<...>で型を表わすところがDylanっぽい。

(my-but-last '(1 2 3 4))
;=> (3 4)

(dm my-but-last ((u <lst>))
  (if (nul? (tail (tail u)))
      u
      (my-but-last (tail u))))
;

ArcでL-99 (P47 真偽値表 その2)

| 14:38 | ArcでL-99 (P47 真偽値表 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P47 真偽値表 その2) - わだばLisperになる

今回は、前回のものを一捻りして、与える式をより普通の数式に近い表現で与えられるようにするというお題です。

適当に、2引数であることを決め打ちにして、中間記法→前置記法変換を書いてみました。

conjunct-not-exprという表現が英語として正しいのかどうかは謎です…。

(let (A B) '(t nil)
  (table/b (A B)
   ;; 式
   A *and (A *or not B)))
;=> ====
;   t: t => t
;   t: nil => t
;   nil: t => nil
;   nil: nil => nil

(mac table/b ((a b) . expr)
  `(do (prn "\n====")
       (each (,a ,b) (perm (list ,a ,b))
         (prf "~ : ~  => ~ \n" ,a ,b ,(to-prefix expr)))))

(def to-prefix (expr)
  ((afn (expr)
     (if atom.expr expr
         ;; not X ...
         (and (acons expr) (is 'no car.expr)) 
         (if (acons cadr.expr)
             `(no ,(self cadr.expr))
             expr)
         ;; X ...
         (atom car.expr) 
         (let (a pred b) expr
           `(,pred ,a ,self.b))
         ;; (X ...) ...
         'else
         (let (a pred b) expr
           `(,pred ,self.a ,self.b))))
   (conjunct-not-expr expr)))

;; notを先に結合させるための関数
(def conjunct-not-expr (expr)
  (if no.expr ()
      ;; not X ...
      (is 'not car.expr) 
      `((no ,(if (atom cadr.expr)
                  cadr.expr
                  (conjunct-not-expr cadr.expr)))
        ,@(conjunct-not-expr cddr.expr))
      ;; X ...
      (atom car.expr)
      (cons car.expr (conjunct-not-expr cdr.expr))
      ;; (X ...) ...
      'else 
      (cons (conjunct-not-expr car.expr)
            (conjunct-not-expr cadr.expr))))

Arcのマクロ

| 14:11 | Arcのマクロ - わだばLisperになる を含むブックマーク はてなブックマーク - Arcのマクロ - わだばLisperになる

(mac foo (a b)
  `(prf "#,a #,b"))

で、

(foo x y)
;=> (prf "#x #y")

となることを期待してしまうが、残念ながら今のところ

(prf "#,a #,b")

となる。

便利なので、展開されると良いなと思ったり。

DESTRUCTURING-BIND

| 09:13 | DESTRUCTURING-BIND - わだばLisperになる を含むブックマーク はてなブックマーク - DESTRUCTURING-BIND - わだばLisperになる

CARとCDRの組み合わせの代わりにDESTRUCTURING-BINDを使用するメリットを一つ発見。

DESTRUCTURING-BINDだと、ラムダリストキーワードのお蔭で

(car ()) => NIL
(car '(())) => NIL

の違いを判定することができる。

(destructuring-bind (&optional (x () car-win) . y) ()
  (list x y car-win))
=> (NIL NIL NIL)

(let ((lst () ))
  (let ((x (car lst))
        (y (cdr lst)))
    (list x y)))
=> (NIL NIL)

ゲスト



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