Three.jsなWebアプリをCommon Lispで書く話

前書き Lisp Advent Calendar 2016の20日目の記事です。 13日目の記事「フロントエンドもサーバーサイドもCommon Lispで書く試み - @peccul is peccu」のタイトルを見た瞬間「あっ」と思ったのですが、テーマがダダ被りです。しかも、pecculさんの方はメンテ…

Alpineベースの(多少)軽いCommon Lisp実行用コンテナ

前書き 以前「Common Lisp開発環境 on Docker - eshamster’s diary」で紹介した開発用環境とは別に、Common Lispを実行するためだけの環境を作ってみました*1。が、手元でdocker imagesを見ると800MB、Docker Hubで見ても212MBと巨大でした。これをベースに…

リーダーマクロで非公開シンボルの参照を簡略化する @ テスト

「#:g1: リーダーマクロでシンボルの略記をする」を読んでいて、こういうリーダーマクロの使い方することあるなと思ったので投稿。大した用途ではないですが…。 こんなことはないでしょうか。 インタフェースとしては不要なので公開はしたくない補助関数があ…

Common LispでSlack botを作る

チャットbotなるものにも(今さら)手を出してみようと、Slack用のサンプルbotをCommon Lispで書いてみました。 github.com 使い方 一応使い方です。 上記プロジェクトをquicklispからロード可能な場所にclone settings.json.inを参考にsettings.json(下記…

Common Lisp開発環境 on Docker

Docker上でCommon Lisp開発環境(by Emacs+SLIME)を起こしてみました。何が入っているか分からない開発環境だとどうしてもアップデートが億劫になるので、その辺をきっちりコード化したかったというのが動機です。 どちらかと言うとAnsibleやChefのように直…

Dockerを1.10から1.11へアップデート on CentOS7

メモ記事 前説 前回の記事↓で首尾良く?Docker上でEmacsを動かせるようになったのは良いものの、表示が崩れまくって非常にストレスフルという問題がありました。 Docker上のEmacsのビルドでハマった話 - eshamster’s diary 調べてみると、Dockerの下記のissu…

Docker上のEmacsのビルドでハマった話

Docker上でEmacsをビルドしようとしてハマったので対処方法と、ついでに簡単に調査したメモです。 現象 環境は次のような感じでした。 ホスト: CentOS 7.2 (Conoha VPSのデフォルトイメージ利用) Docker 1.10.3 まず、確認用に次のDockerfileを用意します。…

JavaScriptのモジュール定義構文をParenscriptで抽象化(マクロで遊ぶ)

前書き JavaScriptを書いていて「ここでマクロがあれば…」と思う事案があったので、マクロ欲を満たすためのエントリです。 JavaScriptでのモジュール定義 JavaScriptでcounterモジュールを作ってみます。 var counter = (function() { var count = 0; var ad…

[JavaScript] ブラウザからSuperAgentでファイルをPOST

ブラウザからSuperAgentでファイルをPOSTしようとしてハマったのでメモ。なお、SuperAgentはAJAX通信に特化した軽量なJavaScriptライブラリです。 SuperAgent紹介記事リンク:jQuery.ajaxの代わりにSuperAgentを使う - Qiita ハマった部分 まず、HTMLでform…

[Common Lisp] システム内のパッケージ間の関係をグラフ化

システム内に存在するパッケージ間の参照関係をgraphvizでグラフ化するRoswellスクリプトmake-package-tree.rosを書いてみました。リファクタリングに使える…かもしれません。 github.com 前説 これを作ったきっかけの話です。 Common Lispを始めた頃に、と…

Node.js本のサンプルをCommon Lispで書く

JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック作者: クジラ飛行机出版社/メーカー: ソシム発売日: 2015/08/31メディア: 単行本この商品を含むブログ (2件) を見る こんな本を買いました。タイトルを見てもピンと来なかったのですが、目次…

Common Lisp開発環境を新規に作ったのでメモ

JavaScriptの本「JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック」を買ったのでCommon Lispの環境を新規に作ってみました(正しい日本語です)。 Emacsには抵抗がなく、これからCommon Lispを始めたいという人にもちょうど良いぐらいの内…

認証付きプロキシ環境でも(多少は)快適なpackage-installの利用

Emacs24を入れてから、list-packagesで適当にパッケージを追加してきたのですが、そろそろ.emacs.d/init.elのポータビリティが怪しくなってきたので、環境を見直し始めました。当初は、CaskやEl-getといったモダンな?パッケージマネージャを使おうと意気込…

2015年に作っていたもの

2015年に作ったものまとめ。1つ例外を除いて全部Common Lispでした。 全体的に飽き性っぷりが垣間見えるだけな気もしますが、来年どれかは発展させていきたいです。 オセロ (旧版:sample-of-eshamster/othello-cl · GitHub) github.com 作るものに困った…

2015年の斑鳩

せっかくブログを作ったので斑鳩についても2015年のまとめ。 目標と進捗 特にデスクトップPCがお眠りになって以来、Lispと音ゲーにかまけてほぼサボっていました…*1。 3400万という次なる理想に対する以下の小目標(後付け)はどれも道半ばといったところで…

マクロ展開時に副作用を起こすことの恐ろしさ

Lisp Advent Calendar 2015の23日目の記事です。 qiita.com すごく及び腰でしたが、ずっと空いていたので、えいやで登録してみました。 マクロ展開時に副作用を起こすな危険、という内容です。 前書き On Lisp: マクロのその他の落し穴によると、「Lispは,…

SBCLとCCLの違い:defstructのincludeにおけるスロット名の比較方法

Common Lispの構造体定義マクロdefstructでは、:includeで別の構造体のスロット名やその初期値を引継ぐことができます。このとき、下記の(a 100)のように初期値を上書きできます。 CL-USER> (defstruct parent (a 10) (b 20)) PARENT CL-USER> (defstruct (c…

Common Lispでマクロ展開時エラーをテスト

前回記事の「Parenscriptで少し遊んで見る (5)defstruct編 - eshamster’s diary」ではdefstruc.psマクロ内で展開時のエラー処理を入れたので、テストも一緒に作っています。このときに、マクロ展開時のエラーをテストする方法が意外と見つからなかったので…

Parenscriptで少し遊んで見る (5)defstruct編

Parenscript(PS)用にdefstructのサブセットを作った話です。例によってParenscript拡張の実験場、ps-experimentプロジェクトで実装を試みています。今回の記事時点のタグblog-play-ps-5をつけています。 github.com 前書き:Parenscript拡張の方針 ここま…

Parenscriptで少し遊んで見る (4)続・defun編

背景 第一回では、ps環境の外側でdefunするためのdefun+psを用意しました。そして、それをまとめてJavaScriptに出力するためのwith-import-ps-defマクロを作ったわけですが、出力する関数名を一々指定する必要がありました。 いったんはそこで妥協したのです…

Parenscriptで少し遊んで見る (3)キャメルケース編

リードマクロによるキャメルケース 今更ですが、Parenscriptでは大文字を表現するために、文字の直前にハイフンを置きます。 CL-USER> (ps (@ document get-element-by-id)) "document.getElementById;" Common Lispでは通常シンボル名は大文字として解釈さ…

Parenscriptで少し遊んで見る (2)ドット記法編

@マクロが長い Parenscriptを書いていると真っ先に気になってくるのが@マクロです。下記の最初の例のように一つ程度ではそうでもないですが、いくつか並ぶと主張が激しく気になってきます。newに至っては単体でもだいぶ見づらいです。 CL-USER> (import 'ps:…

Parenscriptで遊んで見る (1) defun編

TypeScriptやCoffeeScriptといったJavaScriptを吐き出す言語の名前をしばしば聞きます(まだ使ったことはないです…。)が、Common LispにはParenscriptというものがあります。少しいじってみていたのですが、defun周りが気になったので少し遊んでみたという…

Common Lispでナイーブベイズをナイーブに実装

精度を問わず簡単に使える分類器が欲しかったので、Common Lispでナイーブベイズ分類器cl-naive-bayesを作りました。 github.com 使い方は簡単です。まずは学習。学習結果を保持するlearned-storeを用意した後は、learn-a-document関数にこのstore,ドキュメ…

Let Over Lambdaのnlet-tailがよく分からなかったのでメモ

在庫切れになっていたLet Over Lambdaの訳本にオンデマンド版なるものが出ていることに気付いたので買って読んでいます。 LET OVER LAMBDA―Edition 1.0作者: ダグホイト,Doug Hoyte,タイムインターメディアHOPプロジェクト出版社/メーカー: エスアイビーアク…

引数文字列をinternするアナフォリックマクロでハマったこと

CSVファイルを処理するために、引数の文字列をシンボル化して(intern)束縛するアナフォリックなマクロを書いていてハマったことのメモ。シンボルとパッケージの関係は段々と分かってきたつもりでしたが、まだまだハマるときはハマりますね。 悪い例 例のた…

Common Lispで遅延評価を作って遊ぶ(4, 完) - 数列生成リードマクロ

今回の目的 第3回(その1、その2)では、作成した数列生成リードマクロでひとしきり遊んでみたわけですが、今回はそのリードマクロの話を書きます。なお、リードマクロそのものについて(浅く)理解した内容については別記事「リードマクロ入門、の10分の1歩…

AngularJSでアコーディオンパネルを作成

目的 いわゆるアコーディオンパネルが欲しかったのですが、MEANスタックなんて言葉を聞いてちょっと興味があったので、AngularJSで作ってみました。これだっというサンプルが意外に見つからなかったので一応メモに残しておこうと思った次第です。要件はおお…

Caveman2でCL-Markupを使う準備

目的 何か作ってみようかとCommon LispのWebフレームワークCaveman2を使い始めてみました。デフォルトのテンプレートエンジンとしてDjulaがサポートされていますが、閉じタグ書くなんて面倒くさい…と思い、CLで記述できるCL-Markupの利用を考えています。こ…

リードマクロ入門、の10分の1歩ぐらい後か前

Common Lispで遅延評価を作って遊ぶ(1) - eshamster’s diaryシリーズ付録 今回の目的 遅延評価で遊ぶシリーズでリードマクロの話に入ろうとしたのですが、リードマクロ自体について学んだことを書くだけで長くなりそうなので記事を分けました。この辺りが…

Common Lispで(簡易)RSS解析

前書き ちょっとCommon LispでRSSでも解析してみようかとRoswellスクリプト(紹介記事, GitHub)を書きました。 コード ※2015/09/13追記:roswellでインストールできる複数環境(ccl, clisp, sbcl)で試した見たのですが、cclでしか動かないようです。SBCLは…

F#でMAL(Make a Lisp)を実装し始めた

MAL with F 少し前に1週間ほど休めたので前々から興味のあったMAL(Make a Lisp)(LISPインタプリタ)を前々から興味のあったF#で実装しはじめました。連休中になんとかStep4までは完了させた(テストでOptionalになっているものは無視)ので、途中で思ったこ…

Common Lispで遅延評価を作って遊ぶ(3-2) - 素数列で遊ぶ (数列で遊ぶ - その2)

今回の目的 ここまでに作ったcl-lazyライブラリを使って、こまけーことはいいんだよ、の精神で色々な(数)列を作って遊んでみたいと思います、第二回。数といえば自然数、自然数といえば素数、ということで素数列を作ってみます。 前回と同じく、冗長なので…

Common Lispで遅延評価を作って遊ぶ(3-1) - (数)列で遊ぶ、その1

今回の目的 ここまでに作ったcl-lazyライブラリを使って、こまけーことはいいんだよ、の精神で色々な(数)列を作って遊んでみたいと思います。気ままに遊んでいたら思いの外に長くなったので適当に2回に分けようと思います。 なお、以下では冗長なのでREPL…

Common Lispで遅延評価を作って遊ぶ(2) - 数列生成マクロ

目的:より直感的に数列を作成する 前回遅延評価ライブラリを作って無限長数列を作成することができました。フィボナッチ数列の定義を再掲すると以下のようになっていました(Warning等の出力は省略)。 CL-USER> (defun fib (a b) (lcons (+ a b) (fib b (+…

Common Lispで遅延評価を作って遊ぶ(1)

目標:無限長数列 遅延評価というものを始めて耳にしたのはHaskellの入門書*1ですが、印象的だったのはやはり"[1..]"、ご存知無限リストですね。CやC#の世界で平和に暮らしていた人間にとっては中々衝撃的でした。 ということで、Common Lispで遅延評価(Laz…

このブログについて

動機など プログラムを書いていて調べたことなどのメモを残そう、というのがブログを始めようと思った主な動機です。今まではプライベートなWikiにだけ書いていたのですが、まあ隠してもしょうがないかと思い始めました。細々と続けられればと思います。 最…