タグ

ブックマーク / blog.3qe.us (6)

  • Common Lispでリードマクロしてみた - Lambdaカクテル

    common lispではマクロによって式を変形することでプログラムを柔軟に書くことができる.今回はリードマクロを使って,便利なデバッグプリントを実装したい. 柔軟なマクロ,それがリードマクロ 定義方法が2種類あります 普通の関数をマクロの体に仕上げていこう streamをとるようにする トリガー文字をとるようにする S式を返すようにする ディスパッチング・リードマクロとして定義する なんで*read-table*を複製するのか 完成 追記(2018/11/13) 柔軟なマクロ,それがリードマクロ 一般的なマクロは通常の関数呼び出しと同じように(マクロ名 引数 ...)といった形をとるが,より柔軟に式を表現したいときもあろう.リードマクロというものを使うと,ある特定の文字をトリガーとして,文字列を扱うように自由に式を書き換えることができる. 一般的なマクロ S式を受け取ってS式を生成する

    Common Lispでリードマクロしてみた - Lambdaカクテル
    nfunato
    nfunato 2018/11/14
  • openSuSE Tumbleweedでlemを動かす(ncursesトラブル) - Lambdaカクテル

    lemを動かすのにちょっと苦労したのでメモ. TL;DR ros install cxxxr/lem vi ~/.roswell/lisp/quicklisp/dists/quicklisp/software/cl-charms-****/src/low-level/curses-bindings.lisp "libncursesw.so.6"を読み込んでいる箇所をコメントアウトし,libncursesw.so.5が読み込まれるようにする lem lemとは lemとは,Common Lispで書かれたEmacsライクなエディタである. github.com Common Lispで設定を記述することができ(拡張を書くことができ),内部でCommon Lisp処理系を起動したり,外部で起動したCommon Lisp処理系にSWANKプロトコルで接続することもできる,Common Lispと

    openSuSE Tumbleweedでlemを動かす(ncursesトラブル) - Lambdaカクテル
  • Common Lisp困りどころ その1: `package-inferred-system` - Lambdaカクテル

    Common Lispは良い言語だが,初心者が必ず陥る困りどころがいくつかあり,これで出鼻を挫かれるようなことがあってはいけないと思っている. そこで,この困りどころを提示することによって,よりよい解決方法や回避策がインターネットを通じて集ってくるのをうながそうという試みとして,この「 #CommonLisp困りどころ 」シリーズをやることにした. twitter.com Common Lispのパッケージ管理における革新であるpackage-inferred-systemについて,ちょっとした解説と,不満点を書き出してみる. もしよければ手をさしのべてほしい. パッケージの導入 まず一般的なプログラミングの技法として,開発しているソフトウェアが複雑になった場合,モジュールとしてソフトウェアを分割するのが普通である.Common Lispにおいて,モジュールの単位はパッケージpackage

    Common Lisp困りどころ その1: `package-inferred-system` - Lambdaカクテル
    nfunato
    nfunato 2018/06/30
  • SWANKサーバによるEmacs SLIMEとdocker-composeとの連携 -- 現代的なCommon Lisp開発 - Lambdaカクテル

    EmacsとCommon Lispとの相性は抜群に良い. SLIMEというプラグインを使うと,Emacs上でCommon Lisp処理系を立ち上げて接続したり,既に起動している処理系に接続したりすることで,REPLや補完を動作させられる.このEmacsとCommon Lisp処理系との接続は,処理系上でSWANKサーバというのを起動することで取り持ってもらっている. ローカルで動作している処理系にSLIMEで接続することはよく行われるし,そのためのドキュメントも充実しているようだが,しかしdocker,とくに現代的なdocker-compose環境でCommon Lispプロダクトを開発する際に,Emacsを処理系に接続し効果的な開発を行う方法についてのドキュメントはあまりみあたらなかった. そこでこのエントリでは,docker-composeで起動した典型的なCommon Lispアプリ

    SWANKサーバによるEmacs SLIMEとdocker-composeとの連携 -- 現代的なCommon Lisp開発 - Lambdaカクテル
  • Common LispのWebフレームワーク「Caveman2」のリクエスト処理を眺める - Lambdaカクテル

    Common LispのWebフレームワークであるCaveman 2で遊んでいる. 今日は,リクエストの前後に処理を挿入し,レスポンスヘッダをいじったりしてみるお話. ある程度Common Lispが分かりますよ,というくらいのレベル感です.僕のレベルは,マクロが書けてうれしいね,とかいうレベルです. 全てのエンドポイントで,リクエストハンドラを処理する前・後ろに一定の共通処理を行いたい,というのは実によくある話だ.例えば認証処理を行いたければリクエストハンドラに到達する前に処理を行う必要があるし,ベンチマークのための特別なヘッダを付与するためにリクエストハンドラを通った後で処理を行いたいこともある.こういった処理は頻繁に使われるが,それらがいかに実現されているかについて運用開始後に知る機会はあまりないのが現状だ. 最近Caveman 2で自分用のアプリケーションを開発していて,そこで1か

    Common LispのWebフレームワーク「Caveman2」のリクエスト処理を眺める - Lambdaカクテル
  • Common Lispで動くブルームフィルタ作った - Lambdaカクテル

    ブルームフィルタとは,そのフィルタに要素が登録されているかを確率的に判定し,そのフィルタに要素が登録されていないことを確実に判定できるデータ構造である.ブルームフィルタは要素が登録されているかを判定することはできるが,その要素を取り出すことはできないという特徴を持っている.なので「フィルタ」である。 今回このブルームフィルタをCommon lispで実装した.実装したとはいっても以下のエントリの実装を真似ただけのものである. postd.cc Murmurhash3の実装がなかったので,ハッシュ関数にはひとまずIroncladのadler32を採用した.Ironcladを使った理由は,手頃で一般的なライブラリであること,adler32を使った理由は,そこそこ早いという話をどこかで聞いたからで,大した理由はない. github.com インストール quicklispに登録していないので,b

    Common Lispで動くブルームフィルタ作った - Lambdaカクテル
  • 1