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 |

2011-01-16

マクロ 99問 P01 補足

| 14:02 | マクロ 99問 P01 補足 - わだばLisperになる を含むブックマーク はてなブックマーク - マクロ 99問 P01 補足 - わだばLisperになる

M-99の前回の回答ですが、コメント欄にて色々と教えて頂きました。ありがとうございます!

lkozima2011/01/15 23:31
こんな書き方もできますね。慣れてないと読めなそうですが。
(defmacro listq (&rest args) `',args)

なるほど!、確かにこちらの方が簡潔です。

解釈としては、

`(quote ,'(a b c d))

となっていて、quoteされた式をunquoteした中身でquote式を作成する、という感じです。

前回の自分の回答は、

`(list ,@(mapcar (lambda (x) `(quote ,x)) '(a b c d))))

というような感じで、(list 'a 'b 'c 'd)を作成しています。

defmacroの&restが毎回新規にリストを作成するならばどちらも同じことな気もしますが、ちょっと追い切れていません。

SaitoAtsushi2011/01/16 09:17
syntax-rules だと再帰的にしなくても出来ますよ。
(define-syntax listq
  (syntax-rules ()
    ((_ arg ...) (list 'arg ...))))

なるほど、パターンマッチで全部解決できるのですね!。これは勉強になります。

ついでなので他のLISP方言でもやってみました。

Dylan

DylanのシンボルのLISP風解釈が良く分からず挫折。

具体的には、変数の名前をシンボルに変換することが可能なのかどうか分かりませんでした。

また、Dylanでは、シンボルは、foo:や、#"foo"と表記できますが、quoteは必要なかったりします。

しかし、実はできたりするのかもしれません。

GOO
(ds listq (,@args) `',args)

(ds listq (,@args)
  `(list ,@(map (op list 'quote _)
                args)))
Arc
(mac listq args `',args)

(mac listq args
  `(list ,@(map [list 'quote _] args)))

GOOもArcも伝統マクロなのでCLと同じになります。

色々試してみるとシンボルの扱いがからんできていて割とLISPのマクロを前提とした問題な気がしてきました。

第1問目としてはあまり良くないかもしれないですね。

Gwydion Dylanのインストール (x86 linux)

| 13:45 | Gwydion Dylanのインストール (x86 linux) - わだばLisperになる を含むブックマーク はてなブックマーク - Gwydion Dylanのインストール (x86 linux) - わだばLisperになる

自分にとってDylanはたまに動かしてみる言語なのですが、何ヶ月かぶりにちょっと試してみようと思うと動かないことが多いため導入方法をメモっておくことにしました。

たまにしか動かさない環境は、VirtualBox上に温存してみているので、VirtualBox上のDebian GNU/Linux x86 sidの上に導入します。

注意点

Dylanの実装には色々あるのですが、現在ダウンロードして入手できるのは、Gwydion DylanとOpen Dylanです。

Open Dylanの方が充実していて良いのですが環境によっては、導入に難儀するので、今回は、Gwydion Dylanにします。

ダウンロード
wget http://www.opendylan.org/downloads/binaries/linux/x86/gwydion-dylan-2.4.0-x86-linux-glibc23.tar.gz
設置

落したファイルをものを標準の場所以外に展開すると、

File does not exist: "/usr/local/share/dylan/platforms.descr"
アボートしました

のように怒られるので、/usr/local以下に展開

$ cd /usr/local/
$ sudo tar xvf /tmp/gydion-dylan-2.4.0-x86-linux-glibc23.tar.gz

ライブラリのパスの設定

$ cat /etc/ld.conf.d/gwidion-dylan.conf
/usr/local/lib/dylan/2.4.0/x86-linux-gcc33

$ sudo ldconfig -v
...

動作確認

$ make-dylan-app p01
# p01の中にp01.dylanや、Makefile等一式できる。雛形としてHello, Worldプログラムができる。
$ make
$ ./p01
Hello, World!

ゲスト



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