Chicken Schemeのlolevelモジュール

lolevelは、
Chicken Schemeで実装していて、
どうしてもCに近いローレベルなメモリアクセスをしたい時に
利用できるモジュールです。

Chicken Schemeコンパイラ経由であれば、
Cのコードを直接使えるので、利用頻度は少ないと思われますが、
下記のようなタイミングになれば使いたくなるかもしれません。

  • どうしてもCのコードは書きたくない
  • インタプリタで試したい
  • Cライブラリがアロケートしたメモリにアクセスしたいが、構造体のバインディングを用意するまではしたくない

lolevel

(use lolevel)

(define (c-f32array-ref ptr idx)
  (pointer-f32-ref
    (pointer+ ptr
              (* idx (foreign-type-size float)))))

(define (c-f32array-set! ptr idx val)
  (pointer-f32-set!
    (pointer+ ptr
              (* idx (foreign-type-size float)))
    val))

pointerが参照する値を取得する pointer-XXX-ref と
値を代入する pointer-XXX-set! を主に利用します。

また、pointerにバイトオフセットを適用した
新しいpointerを返す pointer+ も便利です。

使うかどうか

デコードした生のピクセル列やC配列のデータ参照などに使っています。
しっかりしたバインディングを書きたい訳ではないレベルの
痒いところに手が届く感じがします。