#:g1

ちょっとしたパズル: ACM SIGPLAN Lisp Pointers Volume 1 Issue 6 にのっていた問題

Posted 2013-02-26 14:53:59 GMT

標準関数名の意図的なシャドウ

(define (foo cons)
  (lambda (x y)
    (if (= x 1)
        ...
        (cons x y))))

のようなものを

(defun foo (cons))
  (lambda (x y)
    (if (= x 1)
        ...
        (cons x y))))

と翻訳

(funcall (foo #'bar) 1 2)

として、

(1 2)

のようなものが出力されて悩む


HTML generated by 3bmd in LispWorks 7.0.0

Lisp Meet Up presented by Shibuya.lisp #2 に参加してきました

Posted 2013-02-19 19:58:00 GMT

 先月に続いて月一ペースで開催される予定のLisp Meet Up presented by Shibuya.lispの二回目。
今回はSchemeをフィーチャーした回ということでしたが、会場が始まってSchemeメインの人の数を数えたところ0/13でした。Common Lispの人は4、5人いたので、もうちょっとSchemerが参加しても良かったかなとも思いました。

(1)発表: Common Lispでの日本語プログラミング - chikuさん

 chikuさんによる、Common Lispで『なでしこ』のような日本語プログラミングを、という発表。題からしてCLの日本語周りのまとめかと思っていましたが、リーダーマクロ等を駆使して日本語として読めるような構文でプログラムを書く、という内容でした

(2)発表: 日本語プログラミングとLISP - g000001

 発表というよりプロジェクターを使って私@g000001が適当にデモしただけですが、#:g1: 日本語プログラミングとLISPから、谷川俊太郎の『おとこのマーチ』ネタをデモってみました。
コードにバグがあり、公開デバッグという感じになってしまいましたが、ブログの方が良く纏まっているのでブログを参照してくださいw

(3)発表: CLMLでTwitter発言分析 - masatoiさん

 @masatoi0さんによるTwitterのTLをgithub: mathematical-systems / clmlで機械学習させ、発言がポジティブなものかネガティブなものかを判定するというデモ。UIは、ブラウザを利用し、ウェブのフレームワークとしてWeblocksを利用ということで、純Common Lispな構成。
まだ制作途中とのことでしたが、ビジュアル的にも内容的にもShibuya.lispのテクニカル・トークで発表されたら面白いだろうなと思う内容でした。

Schemeの話

 今回はSchemeの回ということで、Schemeネタを捻り出していました。

  • SRFIネタ
    • → なぜかCommon Lispでデモしました。
  • Schemeで関数を返す関数を多用した場合のデバッグのしづらさと、コンパイル時型チェックの効用について
    • → これもCommon Lispの立場から、いちゃもんを付けていました。CLも五十歩百歩ではという声も。
  • 衛生マクロは何が嬉しいんですか?
    • → 手動でgensymしなくて良いとか、パタンマッチとか…
  • Schemeは静的な方向に向ってるって話だけど、本当なのか
    • → R6RS→R7RSの流れは逆行してるように見えるが…。答えられる人おらず

その他雑談etc

  • arc-compatのデモをしてみました - g000001
    • → 『(』の再定義について若干のやりすぎ感による苦笑
  • Common Lispで、Tを変数名に使いたい
    • → 使えば良いんじゃないの。shadowするとか、|t|とか…
  • Common LispでTCOが効いてるか効いてないかどうやって判定すれば良いでしょう
    • → 結局disassembleして読むしかないのでは?

まとめ

 雰囲気も良く、楽しいmeetupでした。Schemerは何名か参加予定だったと思いますが、残念ながら都合が合わなかったみたいで、ちょっと残念でした。次回は、Clojureの回みたいですが、場合によってはArcでも、Common Lispでも、Schemeでもなんでも良いのではないかなと思ったりもしました。

CMU AIレポジトリ探検: Type Simplifier: A simple type simplifier

Posted 2013-02-02 00:48:00 GMT

Type Simplifier: A simple type simplifierとは何か

 Common Lispには型の指示子があり、色々の合成ができたりしますが、これを簡素化するもののようです。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/ext/types/0.html

 例の如くASDF化してgithubに置いてみました

使ってみる

(in-package :ai.lang.lisp.code.ext.types)

(simplify-type '(and cl:simple-string cl:vector)) ;=> SIMPLE-STRING

(simplify-type '(or cl:simple-string cl:string)) ;=> STRING

(simplify-type '(and cl:simple-string cl:string (cl:string 8))) ;=> (AND SIMPLE-STRING (STRING 8))

まとめ

 もともとは、大昔のAllegro CLのcoerceのバグの対処として作られたもののようですが、型指定が込み入ってきたときに、無駄な指定が入ってないかどうか等を確認するためのツールとして使ってみるのも良いのではないでしょうか。

CMU AIレポジトリ探検: Library of miscellaneous small extensions to Common Lisp

Posted 2013-01-25 12:46:00 GMT

Library of miscellaneous small extensions to Common Lispとは何か

 名前の通り、便利ユーティリティをまとめてみたもののようで、Common Lispには良くあるユーティリティ集といったところです。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/ext/library/0.html

 例の如くASDF化してgithubに置いてみました

使ってみる

 中身は割合に混沌としていますが、面白いものを幾つか紹介

progfoo
(progfoo (list 1 2 3 4)
  (pop foo)
  (pop foo))
;=>  (3 4)
;; マクロ展開
(LET ((FOO (LIST 1 2 3 4)))
  (POP FOO)
  (POP FOO)
  FOO)
Gaucheのrlet、Rubyのtap的なものですが、加えて一番最初の引数をfooという変数で参照できるアナフォリックなマクロです。
自分もfooではなく、itにしたものをatap(Anaphoric Tap)として使ってみたりしていましたが、全く同じアイデアが1991年には既に存在していたんですね。
with-rhyme
(with-rhyme (cl:delete 2 '(1 2 3)))
no rhyme or reasonという言い回しがあるようですが、reasonまでは行かないが、rhyme位ならということでしょうか。全く何もしないマクロで、気になるところに目印として使うためのマクロということみたいです。with-fixmeでも良さそう。
noting-progress
(noting-progress ()
  (dotimes (i 100)
    (note-progress)))
;>>  ......................................................................
;>>  ..............................
;=>  NIL
note-progressと、note-progressの対で使いますが、進行状況を点々で出力させるためのもの。noting-progressの引数で何個目で改行するかが指定できます。

まとめ

 quicklispにも俺ユーティリティは沢山ありますが、眺めると色々の個性やアイデアが面白いですね。

CMU AIレポジトリ探検: PARSE-TIME

Posted 2013-01-23 00:41:00 GMT

PARSE-TIMEとは何か

 名前の通り、時刻表記の文字列をパーズしてuniversal timeに変換するものです。レポジトリの説明を読むと、CMUCL由来のようなことが書いてありますが、最新のCMUCL 20dを調べてみると現在でもext:parse-timeとして存在していました。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/parsing/time/0.html

 例の如くASDF化してgithubに置いてみました

使ってみる


(time:print-universal-time (parse-time "2013/1/23 1:23"))
;>>  23-Jan-13 01:23:00
;=>  NIL

(time:print-universal-time (parse-time "now"))
;>>  23-Jan-13 08:46:16
;=>  NIL

(time:print-universal-time (parse-time "noon"))
;>>  23-Jan-13 12:00:00
;=>  NIL

 ちなみに、Lispマシンのtimeパッケージのように凝った指定はできないようです。


(time:print-universal-time (parse-time "5mins from now"))
;>>> error

(time:print-universal-time (time:parse-universal-time "5mins from now")) ;>> 23-Jan-13 09:31:38 ;=> NIL

まとめ

 色々のparse-time実装がありますが、個人的にはなんだかんだで、srfi-19的なものがつかいやすい気がしています。


(srfi-19:string->date "2013/1/23 1:23" "~Y/~m/~d ~H:~M")
;=>  #<DATE 2013/01/23 01:23:00.000000000 (32400)>

Lisp Meet Up presented by Shibuya.lisp #1 に参加してきました

Posted 2013-01-22 15:36:00 GMT

 昨年の年末、Shibuya.lispの運営形態とスタッフが交代し、今回月一のmeetupの第一回目が開催されるというので参加してきました。告知が出たのが、開催の2日前位で結構急でしたが、結果として13、4名集まったので、集まりは良かったのではないでしょうか。

(1)発表: vimmer向けLisp開発環境の紹介

 chikuさんによる、vim上でのCommon Lisp開発環境のこれまでの試行錯誤と、現在利用している環境のデモ。slime.vim・limp・slimv等あるようですが、chikuさん自身は、現在slimvを利用していて、これが一押しとのこと。emacsで言うところの引数の表示(autodoc)、シンボル名の補完(これは恐らくswank側の機能との連携なのでSLIMEと同一のルール)等を紹介していました。

(2): 処理系をインストールしてみよう

 処理系をダウンロードしてインストールしてみようという時間。Common Lispが対象ということでしたが、Macの人も多かったため、App StoreからダウンロードできるClozure CLが人気でした。@Yuumi3さんが、CCLのcocoaバインディングに興味を示されていたようで、よしこれで何か作ってみよう、とのことだったので今後が楽しみです。

その他雑談etc

  • @emasaka さんが『LISPマシン・プログラミング技法』を持参。一部マニアで盛り上がりました。会場でこの本で読んだことがある人は、4、5名いたようですが、貴重な本です。自分も図書館から借りて読んだことがありましたが、表紙が青いとは知りませんでした。
  • 一部でKCLとその派生の話題で盛り上がりました。
  • 一部でProlog復興会議について盛り上がりました。
  • 他、それぞれCommon Lispの開発での疑問等の相談や情報交換をしていたようです。

まとめ

 雰囲気も良く、楽しいmeetupでした。meetupは大体月一位で開催していきたいとのことだったので、リアルでLisperに会ったことがない、Lispの話で盛り上がってみたい、という方は、参加してみるのも良いかなと思います。

CMU AIレポジトリ探検: XREF

Posted 2013-01-21 16:14:00 GMT

XREFとは何か

 XREFとは、1990年あたりに、Mark Kantrowitz氏によって書かれた、コールグラフを表示するユーティリティです。当時、Kantrowitz氏は、CMUで、Portable Utilities for Common Lispという主に当時のフリーな処理系のユーティリティを充実させようというプロジェクトを立ち上げていて、XREFもそうしたツール群の一つです。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/tools/xref/0.html

 例の如くASDF化してgithubに置いてみました

使ってみる


;;; ********************************
;;; Test Source Program ************
;;; ********************************

(defun top-level () 
  "Top level function with null lambda list."
  (let* ((input (read))
	 (key (car input)))
    (declare (special key))
    (case key
      (quit
       (return (values (frob (rest input)) 'quit)))
      (otherwise
       (cond ((member key '(foo bar baz))
	      (barf key (rest input)))
	     (t
	      (frowz (rest input) :key key)))))))

(defun frob (items) "Here we test mapcar." (mapcar #'frob-item items)) (defun frob-item (item) "Here we test apply." (apply #'append-frobs item)) (defun barf (key &optional items) "Optional args test." (cons key (frowz items))) (defun frowz (items &key key) "Keyword args test." (dolist (item items) (let ((frowz (if (eq key 'quit) (intern (format nil "FOO~A" (round (+ (length (process-keys items)) 10))) 'keyword) (snarf-item item)))) (when (string-equal frowz (process-key key)) (setf (node-position key) 12) (return frowz))))) (defun process-key (key) (funcall #'symbol-name-key key))

というソースコードのファイルfoo.lispがあったとします。
ファイルの読み込み:

(xref:xref-file (asdf:system-relative-pathname 
                 :ai.lang.lisp.code.tools.xref "test-source.lisp"))
;>>  Cross-referencing file /l/src/rw/ai.lang.lisp.code.tools.xref/test-source.lisp.
;>>  ......
;>>  6 forms processed.
;=>  <no values>
  
コールツリーの表示:

(xref:print-caller-trees)
;>>  Rooted calling trees:
;>>    TOP-LEVEL
;>>       FROB
;>>          FROB-ITEM
;>>             APPEND-FROBS
;>>       BARF
;>>          FROWZ
;>>             PROCESS-KEYS
;>>             SNARF-ITEM
;>>             PROCESS-KEY
;>>                SYMBOL-NAME-KEY
;>>             NODE-POSITION
;>>       FROWZ
;>>          PROCESS-KEYS
;>>          SNARF-ITEM
;>>          PROCESS-KEY
;>>             SYMBOL-NAME-KEY
;>>          NODE-POSITION
;=>  NIL
   
frowzを呼出しているもの一覧

(xref:list-callers 'frowz)
;=>  (BARF TOP-LEVEL)
;    T

itemという変数/関数を利用しているもの一覧

(xref:list-users 'items)
;=>  NIL
;    NIL
;    (FROWZ BARF FROB)

まとめ

 SLIMEのwho-callsでは、CLISPとABCLで、このXREFを利用しているらしく、よりポータブルに書き換えられたソースが同梱されているようです。ざっくり全体の呼び出しツリーを眺めたいこともたまにあるので、そういう場合に利用してみるのも良いのではないでしょうか。

CMU AIレポジトリ探検: FOR

Posted 2013-01-19 22:59:00 GMT

FORとは何か

 1985年辺りにDarrel J. Van Buer氏によって書かれたInterlispのFORマクロのCommon Lisp実装のようです。
元々Common LispのLOOPは、InterlispのFORマクロに由来していますが、Interlispは便利ならなんでも入れちゃえという雰囲気があり、こうした機能が沢山あったりします。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/iter/for/0.html

 ASDF化してgithubに置いてみました

使ってみる:

(for :bind ((base 100))
     :as elt :in '(1 2 3 4) :collect (+ base elt))
;=> (101 102 103 104)
  
上記のマクロ展開:

(PROG ($$VAL ($$ITER 1) (BASE 100) (ELT 1) (#:G11163 '(1 2 3 4)))
 $$LP
  (IF (NOT #:G11163)
      (GO $$OUT)
      (SETQ ELT (CAR #:G11163)))
  (SETQ $$VAL (CONS (+ BASE ELT) $$VAL))
 $$ITERATE
  (SETQ #:G11163 (CDR #:G11163))
  (GO $$LP)
 $$OUT
  (SETQ $$VAL (NREVERSE $$VAL))
  (RETURN $$VAL))
   
TODO:
マクロ展開の連鎖で式を組み立てるのではなく、EVALで組み立てているため、未束縛変数の警告が沢山出ます。この辺りを、ちまちま直すのも盆栽趣味として乙かなと思います。

まとめ

 スタイルとしてはかなり古いコードですが、こういうスタイルもあったのかと眺めてみるのも、なかなか乙です。

CMU AIレポジトリ探検: DEFTABLE

Posted 2013-01-19 20:36:00 GMT

DEFTABLEとは何か

 今から約20年前にNorvig氏が書いたテーブル関係を簡単に扱えるようにしたライブラリです。ハッシュテーブル・alist・plist・シンボルのプロパティ等々がバックエンドに使えます。また、ユーザーがバックエンドを追加することも可能です。

ソース:
http://www.cs.cmu.edu/afs/cs/project/ai-repository/ai/lang/lisp/code/syntax/infix/
Norvig氏のサイトからも入手できるようです。
http://norvig.com/deftable.lisp

 例のごとくASDF化してgithubに置いてみました

使ってみる:

(use-package :ai.lang.lisp.code.ext.tables)

(deftable tab)

(defun dedup (lst) (clear-tab) (dolist (e lst) (put-tab e t)) (let* ((ans (list nil)) (tem ans)) (map-tab (lambda (k v) (declare (ignore v)) (rplacd tem (setq tem (list k))))) (cdr ans)))

(dedup ()) ;=> NIL (dedup '(1 2 3 4 5 6 7 1 2 3 4 5 6 7)) ;=> (1 2 3 4 5 6 7)

まとめ

 PAIPなどでも評判の高いNorvig氏のコードですが、deftableのコードも色々勉強になります。

Sagittarius 0.4.1 インストールメモ

Posted 2013-01-19 19:04:00 GMT

 Sagittariusの0.4.1が出たらしいので早速インストール。

OS: Ubuntu Linux 12.10 x86_64
$ wget http://sagittarius-scheme.googlecode.com/files/sagittarius-0.4.1.tar.gz
$ tar xvf sagittarius-0.4.1.tar.gz
$ cd sagittarius-0.4.1/
$ cmake .
$ make
$ make test
$ make doc
$ make install
ドキュメンテーション:
Sagittarius Users' Reference

(import (srfi :42)
        (match)
        (sagittarius control))

(define (fib n) (car (fold-ec '(1 0) (: i 1 n) #f (match-lambda* ((_ (a b . rest)) (list (+ a b) a))))))

(fib 100) ;=> 354224848179261915075

 Schemeも少しは書けるようになりたい…。

Older entries (1546 remaining)