2019の25日目の記事です。Lispのライブラリをつくりました。これは、このライブラリのもつ値設定マクロsetfを通してシンボルに値を設定するとそのシンボルの値の履歴が残るようになる、というものです。Lisp単体では画面への描画ができないためCFFIを通して描画スレッドにコールバック関数を渡してやることがよくあります。REPLからコールバック関数を変更できたりして便利なのですが、lambda式なんかを渡していると、エラー時に差し替えようがなくてけっきょくCL処理系のスレッドごと落としてロードしなおすことになります。REPL駆動のよさみを受けていない。Lispのbindings)を通じて関数を渡すようにすればいいなあーと2019年12月ごろにおもいつきました。そのついでに、エラーが起こった瞬間に値を巻き戻す的な操作があると便利かもしれない、と思ったため実装しました。想定利用ケースとして以下のようなものを想定しています:おもむろにシンボルの束縛していた過去の値にもどしたいエラー時、自動で1個前の値にもどしたい概要Hysteresisではシンボルに履歴というものを導入します。symbolsとこのライブラリでは呼ぶことにしました(historizedって「歴史に名を残す」という意味らしいですがライブラリの内容的に洒落っぽくていいなと思いました)。履歴つきシンボルとかおおげさな胡椒ですが、専用の構造体にリングバッファがついていて、リングバッファの最大長以内であれば値が保持されるシンボルがある、というていどのものです。値の設定と取得はhysteresis:set-valueとhysteresis:get-valueを用います。シンボルをキーとして内部のハッシュテーブルに保持された値履歴に書き込んだり取得したりします。'foo)42でもこれは内部API的であまりユーザに利用されることはあまり想定していません。hysteresis:hsetqというsetqもどきを通じて、シンボルマクロを定義するのが便利です。利用感はこんなかんじです。hoge42歴史を戻したり現在に戻ったりする履歴つきシンボルは、もちろん過去の値に遡ってシンボルの値を戻すことができます。値を設定しておきます。Sun"に戻したいと思いました。こんなときhysteresis:revertを用いると、全ての履歴つきシンボルの値を2つもどすことができます。最新の値に全てもどしたい場合もありますよね(たとえば過去の値もヤバかった的な)。そんなときはhystresis:presentを用いると、最新の(現在の)値に戻ります。Man"値ったら最強ね(9)。履歴つき関数さて、冒頭ではゲームとかでコールバック関数がうんぬんという話がでてきました。このライブラリでは関数も履歴つきにすることができます。hysteresis:hdefunの登場です。"wow")"wow"そしてもちろん履歴を辿りたい場合がある(はず)です。そんなときにはhysteresis:revertを用いることができます。HOGE)こんな感じで、履歴を遡ったり現在側にもどってきたりできます。機能としてはとても単純なので、このような感じです。実用する(ゲームとかで?)まとめシンボルに履歴を持たせるライブラリをつくりました。このアイデアに需要があるのか、ほんとうに問題(動機)の解になっているのか、などが謎なのでこれから実用してみて判断を下す段階のものだと思います。プロトタイプベースオブジェクト指向を実現する拡張ライブラリひょんなことから見つけた*1のでちょっと遊んでみました。この記事はLispアドベントカ...2018-10-15第7回関西Lispユーザ会に行ってきたその昔、Lispを実行することに特化したマシンがありました。プロトタイプベースオブジェクト指向を実現する拡張ライブラリLinux版OneShotの終盤でファイルが開けない(ネタバレ注意)月別アーカイブはてなブログをはじめよう!t-sinさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。