上でのちょっとした作業を自動化したいことは時折あると思います。Lispで出来ないものかと思い、色々と調べながら試してみました。Seleniumテキトーに調べた所、Seleniumというのを使うと簡単にブラウザ上での作業を自動化できるようです。Serverとやらを動かして、そこにHTTPリクエストを投げるとそれに応じてブラウザが色々やってくれるとかなんとか。自分で書く自動化用のプログラムはHTTPリクエストを投げるだけで、難しいところはSeleniumが全部やってくれると。詳しくは詳しい人に聞いてください。WebDriverというものを見つけました。サンプルコードを見る限り簡単そうです。してやればすぐ使えます。評価すると別のものがインストールされます。以下に同名のプロジェクトがある場合、そちらが優先されるようです。詳しくは詳しい人に聞いてください。試してみた試しにブラウザを起動してAmazonで検索をするプログラムを書いてみました。検索ボタンをクリックT見事動くのですが、コレだけだとTが得られるだけであまりおもしろくありません。WebDriverにはスクリーンショットを撮るための機能が提供されていません。serverに簡単なGETリクエストを送るとスクリーンショットが撮られ、base64エンコードされたpng画像が返ってくるようなので、自分でスクリーンショットを撮る関数を書いてみました。Lispのいいところ(publicおじさん並感)。WebDriverの関数やら変数やらを好き勝手使いGETリクエストを送り、base64デコードしてファイルに書き込みます。これで無事スクリーンショットが撮れました。WebDriverの機能が足りなかったり、さらにはバグもあったりするので、宗教上の問題がない限り、素直にPythonでも使ったほうが簡単です。自動的メモリ管理を構成する理論と実装を読んでたら、ごみ集めのたびにマークビットの意味を反転させればunmarkのコストを避けれる、という話があったので試してみた。これが効果があるのはヒープが巨大な時と、unmarkのコストが大きい時だろう。巨大なヒープを使うのはいやなので、unmarkのコストが大きい(要するに遅い)NScLisperでこれを実装してみた。msどちらも評価時にごみ集めは8回走った。速くなったといえば速くなったけど、それほど大きな違いはなかった。NScLisperのヒープが小さすぎるのが一番の原因だろう。NScLisperのヒープは2900セルしかない。何もする必要はなかったが、この変更により「マークされてないことを表す値」をマークビットに設定する必要が出てくる。このコストはunmarkと変わらない。unmark処理省略の恩恵を受けれるのは基本的に生きているオブジェクトだけだ。(正確にはプログラム終了時に使われてないセルについてもunmarkのコストを避けたことになるが、逆に最初のごみ集めが起こるまでのconsingでは余計なコストが増えている)このプログラムでは常に約700セルが使われているので、8回のごみ集めで合計5600回分のunmarkのコストを避けたことになる。これだけで455ms速くなったのだからお得といえばお得な気もする。変数が合計で4096個しか作れない(ヒープやスタックも含む)環境下で変数を1つ消費する価値が有るかというと、やはり微妙なところだ。(自分用メモ)マーク済みを表す値ではなくマークされてないことを表す値を変数に入れたほうが減算の回数が減るのではないかと気付き試したが、結果に変化は見られなかったのでrevertした。HyperSpecをまじめに読んでたら、だんだんenvironmentが分からなくなってきたのでメモ。objectではなくbindingの集合の意味でのenvironment。environmentは複数存在することがうかがえる。明示的にそんなことは書いてない。いうのか探したが見当たらないので非常に困る。environmentを新たに作るらしい。environmentは複数存在するという予想は正しそうだ。environmentを作ると書いてある。pointのbidingを加えたものらしい。forceと呼ぶのかわからないのは置いておいて、肝心のblockの説明を見に行くとenvironmentについて何も言及していない。environmentを作りそうなletの説明を見ても新たなbindingを作るとは書いてあるがenvironmentについてはやはり言及していない。operatorが新たなenvironmentを作るのかわからない。HyperSpecを探しまわった所、with-accessorsがenvironmentを作るという記述を見つけた。variables.with-accessorsはsymbol-macroletに展開できるという話も書いてあるので、symbol-macroletはenvironmentが作ると考えてもいいのかもしれない。symbol-macroletの説明を見ると、やっぱりenvironmentを作るなんて話は書いてない。分からないということがよく分かった。Prologの双方向代入最高!はじめに8年ほど前に『論理学を作る』という本を読みまして、そこにタブローの方法と呼ばれる論理式の集合が充足可能か調べるアルゴリズムが載っていました。「暇があったらいつか実装してみるか」と思っていたら8年も経ってしまいましたが、暇があったので実装してみました。タブロー(tableau)とは要は木で、木を書くと論理式の集合が充足可能かどうか分かるというものです。いう時にはWikipediaさんに説明を任せたいのですが、日本語版にはまるで情報がありません。英語版はきちんと書いてあるっぽいので気になる方はそちらを参照してください。両方が現れなければ充足可能。すべての経路にAと¬Aの両方が現れたら矛盾とわかるという仕組みです。対してタブローを描くと次のようになります(記号は適切に読み替えてください)。A∨Bを充足させるためにはAかBが真になる必要があります。¬Aがあるので、Aは真には出来ません(右の経路)。Bが真になれるのでこの集合は充足可能です(左の経路)。はい、ようやくPrologの話ですさて、この図ですが、Prologで書きました。コマンドに入れてやると図が出てくるという仕組みです。いうのは充足可能という意味です。fail.もっと複雑な入力を入れてみましょう。