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-01-19

俺Arc祭り 2008冬 (5)

| 03:05 | 俺Arc祭り 2008冬 (5) - わだばLisperになる を含むブックマーク はてなブックマーク - 俺Arc祭り 2008冬 (5) - わだばLisperになる

12. Data Types

データの型について

  1. シンボル
  2. 数(Common Lispと同じ)
  3. コンス
  4. 文字
  5. 文字列
  6. 配列
  7. クラス、オブジェクト
  8. データベース(ハッシュ/連想リスト)
  9. 関数
  10. マクロ
  11. その他

だそうです。マクロってのが光ってはいますね。

13. Compounds = Functions on Indices

複合したデータをインデックス付きの関数とみなす試みとのこと。

これも無理目なので、funcallみたいな、obcallというものをでっち上げて代用することにしてみました。


;; 動作
(obcall "hello" 2) 
;=> #\l

(obcall '(foo bar baz) 1)
;=> bar

(map #'pr '(3 4 1 2))
;=> 3412

(map "carpet" '(3 4 1 2))
;=> (#\p #\e #\a #\r)

;; ---- 定義 
(defun obcall (obj index)
  (elt obj index))

(defun map (fn &rest args)
  (if (functionp fn)
      (apply #'cl:mapcar fn args)
      (apply #'cl:mapcar (fn (x) (obcall fn x)) args))) ;複数の引数の場合は?

14. Strings Work Like Lists

文字列をリストに見立てるとのこと。TAO/ELISって文字列をリストとして扱えたらしいというのをどっかで読んだ記憶があるのですが、こういうこともできたんでしょうか。マニュアルには載ってないので、記憶違いかもしれませんが…。

色々と夢が広がりまくりなのですが、適当にできそうなものだけ作ってみました。


;; 動作
(car "abc")
;=> #\a

(cons #\a "bc")
;=> "abc"

;; ---- 定義
(defmethod car ((obj string))
  (aref obj 0))

(defmethod cdr ((obj string))
  (subseq obj 1))

(shadow 'cons)
(defgeneric cons (x y)
  (:method ((x string) (y string)) 
    (cl:concatenate 'string x y))
  (:method ((x character) (y character))
    (cl:concatenate 'string (string x) (string y)))
  (:method ((x string) (y character)) 
    (cl:concatenate 'string x (string y)))
  (:method ((x character) (y string)) 
    (cl:concatenate 'string (string x) y))
  (:method (x y)
    (cl:cons x y)))