基本的に怠Diary

学習ログを残したい

クソみたいな理由でLispを学ぶな

実は今学んでいるLispにはとある一つの呪いがかかっている。

Land of Lispをすべて終えない限り、私は私的理由で仕事を辞めない。

実はもう一つあったがそれは既に達成済みなので書かない。

しかし我ながらかなり意味のわからない呪いである。

ちなみに決めた理由はこの理由があればどちらが達成しても素晴らしいものを手に入れるから的な理由だったと思います。

今wumpus辺りなので先は長いです。


最近Emacs Lisp書き始めました。

今作ったのはカーソルの上にある英単語の和訳をミニバッファに表示してくれるパッケージ?(

というかパッケージ分けてすらないから関数程度)です。

ロジックは当然大したことなくて、Sqlite形式のDBへバッファから取得した英単語を投げつけて、

返ってきたらprintする的なコマンドみたいになってます。

DBはくじら飛行机先生(Webスクレイピングはこの人の本で初めて知った。)が公開している

kujirahand.com

これを利用しました。

セミコロンで一日消えました。

ちなみにコード

(define-key markdown-mode-map (kbd "<キーバインド>")
  (lambda ()
    (interactive)
    (let* ((db (emacsql-sqlite "/path/to/dbfile"))
           (target (buffer-substring-no-properties
                    (region-beginning)
                    (region-end)))
           (query (emacsql db [:select [word mean]
                                       :from items
                                       :where (like word $r1)]
                           (concat target "%")
                           ))
           )
      ;;長そうなら単語だけにする
      (if (< (length query) 5)
          (mapcar (lambda (x)
                    (print x))
                  query)
        (mapcar (lambda (x)
                  (print (car x)))
                query)
        ))
    )
  )

パスの置く場所とかキーバインドはわりとどうでもいいです。

キーバインドの設定をキバって行くぜ的な言い回し使いたい。

sqlite

Sqliteをそのまま使用した場合、このコードでは動作しません。

「'」ならquote(~)みたいになるだけですが、「;」が入っていると、

「read syntax error」とでてしまい、動作しません。

本当なら読み込んだときにエスケープ処理できたらよかったのですが、

生憎パッケージのコードを理解できなかったため、

暫定的な(というかずっとこれかも)処理を施しました。

暫定的というか、元のDBに

update items set mean = replace(';'," ") where mean like '%;%';

をかけただけです。糞かよ

他にも、「'」とかもreplaceしたほうがいいかもしれません。


クソコード編

elispなら

messageで出力しろ感すごいけど動くもの暫定版と書いておけば自分は許す。

てかmapcarコンビ一つにできるはずでそもそもmapcar使う必要ない気がしなくもないので

少なくとも前者は修正していきたい。

後現時点では英単語からの検索しかできないので、今度は日本語からでもできるようにする予定です。

てかこれの上位互換絶対あるんだよなぁ・・・

実際にgoogle-translate使ったほうが精度高いし逆も容易いし楽っぽいので

オフラインで動作する以外に特にメリットねえわこれ草生。