scheme

Weakポインタとオブジェクト回収イベント

https://github.com/okuoku/r7c/wiki/WeakReferenceAndMetaData Scheme処理系には大抵WeakポインタのためのAPIが有ると思ってたけど、たまに無いのもあるようで。。 バイナリパッチのためのフレームワークを作る必要が有って、オブジェクトのメタデータを格…

chibi schemeの低レベルマクロ

http://compassoftime.blogspot.jp/2013/07/blog-post.html Chibiは低レベルマクロの使い方が分からないので割愛。 Chibi schemeはsyntactic closure族なので(nmoshと同じような)explicit renamingが使える。 (import (chibi) (srfi 1)) (define-syntax appl…

Unspecifiedの数とarity

成立しないifはunspecifiedになるとR7RS等に記述が有る。よく、unspecifiedを生成するイディオムとして (if #f #f) を使うけど、ゼロ値を使わないのは何故だろうか: (values) ただ、確かに、 (call-with-values (lambda () (if #f #f)) (lambda e (display (…

伝説の68kエミュレータsyn68kはScheme風マクロ言語で生成される

(prev: http://d.hatena.ne.jp/mjt/20100912/p2 ) https://github.com/ctm/syn68k/tree/master/syngen https://github.com/ctm/syn68k/blob/master/runtime/68k.scm - 実際の記述 当時としては異様に高速で微妙な精度を誇ったMacOSエミュレータのExecutorは…

SECDR-schemeをつくる の2 - EIODを読む

http://petrofsky.org/src/eiod.scm オリジナルのソース https://github.com/okuoku/eiod-r6rs R6RS移植 常識的なScheme処理系を実装するためには、expanderを実装しないといけない。いわゆるexplicit-renamingなexpanderの方がプロトタイピング等の面で都合…

SECDR-schemeをつくる の1

prev: http://d.hatena.ne.jp/mjt/20110317/p1 SECDR-schemeに収録されているドキュメントにSECDRマシンの命令19個すべてが説明されている。VMは単純にこれをパクることにする。 http://storage.osdev.info/pub/idmjt/diaryimage/1204/secdrscm.pdf doc/tex…

R7RS実装のポイント(改)

R7RSのMLにも投稿したけど、R7RS bridgeを実装していて気付いた点。 http://lists.scheme-reports.org/pipermail/scheme-reports/2011-November/001648.html char-ready? R7RSはbaseライブラリにchar-ready?が含まれる。これはIEEE Schemeに有るという理由で…

オブジェクトシステムの設計 - Immediateの設計

とりあえず、即値オブジェクト(immediate)から設計を始める。immediateは、CPUのワードサイズで表現できるオブジェクトで、schemeでは 数値(fixnum) 文字(char) pair、vector等のオブジェクトへのポインタ あたりのオブジェクトが相当する。これらはGCにスキ…

月刊R7RS - R7RS概要スライドが公開される

http://ccil.org/~cowan/scheme-2011-09.pdf https://groups.google.com/group/scheme-reports-wg1/browse_thread/thread/483e877413e696e4 R6RSからの差分なのでR6RSを知らないと何がなんだかかも。。Gaucheのような普通のR5RSから増えているもの(で、避け…

R7RS WG1 3次投票の結果が公表された

https://groups.google.com/group/scheme-reports-wg1/browse_thread/thread/b7461baa723ead3d http://trac.sacrideo.us/wg/wiki/WG1Ballot3Results 多くの点はR6RSにちかづいた。つまり、 elseのような補助キーワードはboundになった。 blobではなくbytevec…

GaucheのPEGが地味に難しい

moshの0.2.7に入れたGauche由来のPEGパーサは便利なんだけど、なかなか慣れるのが難しい。 スペースで区切られた"hoge fuga hogehoge"の文字列から、'("hoge" "fuga" "hogehoge")のリストを受け取るようなパーサを考える。 (define name ($do [n ($many lett…

10 Scheme One Liners to Impress Your Friends

http://d.hatena.ne.jp/y2q_actionman/20110607/p1 のパクりを(n)moshで。 読み方 (import ...)はライブラリの読み込みでプログラム本体では無いです。(Rubyのrequireのような。) SRFI-xというのは、JavaのJSRとかPythonのPEPのようなもので、番号の付いた言…

R7RS 第3次投票の項目が公開される

http://trac.sacrideo.us/wg/wiki/WG1Ballot 今R7RS WG1は委員が言語デザイン上のチョイスに関して投票で決めるフェーズにある。 投票の項目は非常に多岐に渡り、#85のように、現在のbytevectorをblob(これはchicken等に由来する)に変えるか等の命名の問題か…

R7RSドラフトが公開される

http://lists.scheme-reports.org/pipermail/scheme-reports/2011-April/000366.html http://trac.sacrideo.us/wg/attachment/wiki/WikiStart/r7rs-draft-1.pdf 基本的には、R6RSとは全く互換性が無く、R5RSにモジュールシステムと伝統的なSchemeで一般にサ…

SECDR-Schemeをつくる の0

いわゆる"実装しやすいSchemeインタプリタ"として、SECDマシンが挙げられる。 SECDマシンは、 Stack Environment Code (Control) Dump の4つのレジスタ、というよりスタックを持ったVMで、これに対するSchemeコンパイラは比較的簡単に書くことができる。 min…

explicit-renaming macroの拡張 の2

http://d.hatena.ne.jp/mjt/20110302/p1#c1299028677 モデルから解釈すると、explicit renamingで生シンボルを出力に挿入できるというのは本質的なインタフェースであって、それが処理系にとって都合が悪ければmacro transformerの外でよしなにやってくれ、…

explicit-renaming macroの拡張

今のところ、scheme界のlow-level(= Hygienicでないmacroも書ける) macroには少くとも3つの流儀がある。 伝統的なlispマクロ - defmacro, define-macro。Gaucheやbigloo、Gambit。 syntactic-closureとexplicit-renaming - define-syntax。MIT/GNU SchemeやC…

GuileのR6RS対応を試す

サマリ : 簡単なスクリプトなら動くが工夫が必要 Guile 2.0がそろそろリリースされる。このリリースの目玉は世間的にはJavaScript/EmacsLispのサポートな気がするが、ice-9が標準のモジュールシステムになったことで、Guileのモジュール構文がR6RS Schemeと…

マクロを生成するマクロで表引き

https://github.com/okuoku/yuni-core/blob/c709d7967bcf856bdbfa637f771652feb1d92625/util/tables.sls 表引きのための手続きとマクロを簡単に生成できるマクロを書いてみた。 こういう風に使える。 (define-static-table tbl0 ;; key→data手続の定義 ((key…

define-valuesの書き方

http://d.hatena.ne.jp/mjt/20110113/p1#c1294899823 コメントを頂いた。 (define-syntax define-values (syntax-rules () ((define-values () exp) (call-with-values (lambda () exp) (lambda () 'unspecified))) ((define-values (var . vars) exp) (begi…

構文オブジェクトの設計

R6RSでは、identifierオブジェクトはマクロ(syntax)の中でしか扱えないことになっているが、nmoshでは普通のオブジェクトとして普通のプログラムからも扱えるようになっている。要するに、可能な限り伝統的マクロに近い形で健全なマクロが書けるようになって…

onlyに御用心(補助キーワードもexportする理由)

先日、(shorten)にonlyを足したら正常に動かなくなってしまった。 http://github.com/okuoku/mosh/commit/844463db1fcc0a394e57b1c9b7da3d9d343686c1 この変更を適用したあと、Chez Schemeで試してみると、 prism:lib oku$ petite Petite Chez Scheme Versio…

renamingとR6RSライブラリ

moshのようなR6RS scheme実装の内部は大きく2つのパートに分けることができる。 core言語 - バイトコードコンパイラやC++で書かれた評価器。R6RSのサブセットだけを実行できる。mosh -5で起動できる。 expander - ライブラリの読み込みやdefine-syntaxやlet-…

packet型の導入

nmoshのexpanderを自前のものに置き換える重要な理由は静的型の導入にある。これは僕が修論で作ったyuniSchemeに由来していて、構文だけが新たに設計されている。 (要するに、nmoshにdefine-packet-formatのようなyuniSchemeのconstructを導入することになる…

syntax-caseを実装したい の0

諸般の事情でsyntax-caseを実装したい。 地味に複雑なことができるsyntax-case syntax-caseは一面的には高レベルなマクロで、パタンマッチに従っていろいろと書くことができる。特にellipsisによるパタンの繰り返し表現が強力。。 2つの値のリストを混ぜ合わ…

mosh 0.2.5をリリースしました

http://code.google.com/p/mosh-scheme/downloads/detail?name=mosh-0.2.5-1.tar.gz 今回から新しいR6RS実装のnmoshを含むようになりました。今回の変更は殆どnmosh関連なので、僕が作業しています。 ダウンロードはGoogle Codeですが、コードはgithubに有り…

Gaucheのlambda shorter-namesをR6RSで実装する

lambdaのshorter-name( http://blog.practical-scheme.net/gauche/20100428-shorter-names )は便利な機能なので、nmoshにはコッソリ入れておくことにする。 ^ ^は以前reader macroで実装していたのを、単にsyntax-rulesに変更した。 (define-syntax ^ (synta…

^_のarity

http://d.hatena.ne.jp/mjt/20100508/p1#c1273273909 ちなみに ^_ も便利ですよ。引数を無視したい時に。顔文字みたいになりますが。 実は仕事では^_をn-aryとして使っていて( (^_ 'hoge) == (lambda bogus 'hoge) ) 、Gaucheの記法と互換性が無かったりする…

record-typeとはなんなのか

最近のmoshに対する変更に追従する過程で問題になったのはR6RS record-typeの取り扱い。 R6RSのrecord、平たく言えば構造体には(rnrs records procedural)と(rnrs records syntactic)の2通りのライブラリが用意されている。proceduralは、スクリプトの実行中…

機能追加をどう扱うべきか

nmoshには近々Lua風のテーブル機能を導入する予定で、expanderに手を入れていくつかの構文を追加しようとしている。 問題になるのは、構文を追加するときにどうやって他のSchemeと区別するかというところ。例えば、キーワード構文は他のSchemeとは互換性が無…