nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

Common Lisp

make-instances-obsoleteは何もしてないのでは?

Common Lispの、sbclとcclだけの話になります。 ジェネリック関数make-instances-obsoleteとは、 クラスの再定義に関係するものです。 こいつがよく分からない。 たぶん、クラスを再定義したあとで、 すでに作成されているインスタンスを一斉に更新するとき…

format Justification (幅揃え)

Common Lispのformatの命令である、Justification ~<...~>の説明をします。 この機能はただ空白を均等に出力するだけなのですが、 習得するにはわりと困難だと思います。 理由は「いや、こんな機能どうせ使わないし」と 思って気分が乗らないからです。 だっ…

formatterで高速化

【追記】内容が間違っていたので何回か書き直しました。 Common Lispの、formatterマクロの使い方を紹介します。 このマクロは、formatの制御文字を受け取って関数を返却するものです。 とりあえず例をあげます。 下記のformat文を考えます。 (format t "Hel…

clispをFreeBSDにインストールする2

以前の投稿clispをFreeBSDにインストールする - nptclのブログ では、 portsにてclispのインストールができませんでしたが復活していました。 とても嬉しいです。 それで早速portsでインストールしてみたのですが、 やっぱりclangでコンパイルは無理のようで…

pprint-newlineの使い方

Common Lispで、いまいちよくわからない「条件付き改行」の使い方を見て行きます。 条件付き改行とは、Pretty Printingの機能の一つであり、 名前の通り条件よって改行するかどうかが決まるものです。 この機能はpprint-logical-blockマクロの中で、 pprint-…

クラスをsubtypepしたときの問題点

クラスはsubtypepで継承関係を調査できます。 例えば次の通り。 (subtypep 'standard-class 'class) -> t; t つまり、standard-classはclassを継承しているということです。 次の例はどうでしょうか。 (defclass aaa () ()) (defclass bbb (aaa) ()) (subtyp…

Nptの開発状況

今まで開発に注力してきましたが、そろそろ時間が取れなくなってきたので、 現時点の完成度をまとめます。 loopマクロの開発が終わってv0.1.13をcommitした時点では、 ANSI Common Lispの関数やらマクロやらが 全996個中 919完成 (92%作成) となります。 …

構造体とクラスの読み書きの速度

Common Lispの構造体とクラスはとても似ています。 一体何が違うのかというと、クラスの方が高機能であるというのは何となくわかります。 では、構造体なんていらないのでは? と思われるかもしれませんが、 CLtL2には次のような記載があります。 https://ww…

npt-amalgamationの作成

私はnptというCommon Lisp処理系を細々と開発しています。 まだ目標であるANSI Common Lispの機能は完成していませんが、 以前紹介したときに言った「sqlite3みたいにamalgamationをやってみたい」 というのが先にできたので公開します。 npt-amalgamation h…

整数を英語で表現する5(Lispコード)

だいぶ前に、整数を英語で表現する方法について説明しました。 整数を英語で表現する1 - nptclのブログ 整数を英語で表現する2(中学レベル) - nptclのブログ 整数を英語で表現する3(巨大な数) - nptclのブログ 整数を英語で表現する4(序数と負数) - np…

sbclのスクリプトファイル作成

FreeBSD, Linuxでsbclのスクリプトファイルを作成するメモです。 長々と書きますので、結果だけを先に示します。 スクリプトファイルの1行目には次のように記載すると便利ですね。 #!/usr/bin/env -S sbcl --script スクリプトファイルの作成 sbclには引数--…

日本のWebサイトから情報を取得

Common Lispにより、Webから特定の情報を取得する方法について考えます。 例えば、あるサイトから自分の住んでいる場所の天気だけを取得するような場合です。 私は日本語しかわからないので、当然日本のサイトを対象にします。 そうなるとエンコードの問題が…

unmatch: パターンマッチングライブラリ

unmatch:ifmatchはOn Lispの機能限定版if-matchです。 特徴としては、低速、低容量、緩いライセンスがあげられます。 世の中には様々なCommon Lispのパターンマッチングライブラリがあり、 どれもが洗練された優れたものばかりです。 本ライブラリはそれらと…

strjis: 日本語テキスト入出力ライブラリ

【追記】ISO-2022-JP-2004に対応しました。 strjisの紹介 Common Lispで日本語のテキストを読み書きするライブラリを作成しました。 strjis https://github.com/nptcl/strjis 下記のエンコードを扱うことができます。 JIS EUC-JIS SHIFT-JIS UTF-8, UTF-16, …

オブジェクト関連で思ったこと

規約を翻訳して思ったことは、現状のnptではかなり規約違反があるということです。 :allow-other-keysなんて対応してないですもん。 地道に修正していこうと思います。 他、気になったことを忘れないように記載します。 qualifierはsymbolだけじゃなくて何で…

7章Objectsのジェネリック関数関連の和訳

【追記】7章Objectsの全てを日本語訳しました。 https://nptcl.github.io/npt-japanese/docs/ansicl/7.html https://nptcl.github.io/npt-japanese/md/ansicl/7.html ふたつのリンクは、レイアウトが違うだけでどちらも同じ内容なので好きな方を見てください…

7章Objectsのクラス関連の和訳

【追記】7章Objectsの全てを日本語訳しました。 https://nptcl.github.io/npt-japanese/docs/ansicl/7.html https://nptcl.github.io/npt-japanese/md/ansicl/7.html ふたつのリンクは、レイアウトが違うだけでどちらも同じ内容なので好きな方を見てください…

subtypep実装の基本

正直、あっているかどうかわからないのですが、 確認のために記載していこうと思います。 今回の投稿だけでは終わらないので、気が向いたら続きを書きます。 subtypepの使い方 subtypepとは、左の型が右の型に含まれているかどうかを確認する関数です。 こん…

eqlには3種類の意味がある

表題の通り、Common Lispでは下記の意味があります。 関数eql 型eql eql-specializer なんでこんなにあるんでしょうね。 兄弟分である、eq、equal、equalpさんたちは1つの意味しかありませんよ? それぞれ説明していきます。 関数eql 普通はこいつです。 2つ…

forward-referenced-classとは何か

そんなクラス知らねえと言われても仕方がないほどマイナーなものです。 こいつは、だいたいはmop関連のパッケージに隠れています。 ANSI Common Lispには制定されていませんが、 CLOSを構築する際に必要となるので標準みたいなものでしょう。 まだあんまり読…

Npt Lispの紹介

Nptとは小さいLisp処理系です。 現在開発中です。 https://github.com/nptcl/npt 本ブログは、NptというLispの開発をするにあたり、 難しかったり引っかかった部分をブログに記載して行くことで、 実装の確認をあらためてしていこうという目的がありました。…

引数&keyの内容を指定しない場合を考える

例えば (defmethod aaa (value &key) ...) のように&keyだけを指定して、その後の変数を記載しない場合があります。 全くの無意味のように見えますが、下記2つの場合において意味があります。 続けて&allow-other-keysを指定した場合 defmethodかdefgeneric…

lambdaと記載できる場所はどこか

よく目にする(lambda ...)という表記はかなり特殊なものであり、 マクロを抜きにするならば、限定された場所でしか記述できません。 マクロのlambdaとリードマクロの#'があるため、 式の中で気軽に記載することができるのです。 マクロの例としてはこんな感…

型valuesの使い方

実装していると難しくてイヤになるのが型(typeのこと)です。 型関係の実装で一番難しいのはsubtypepで、ひどいもんです。 今回は難しくはないものの簡単でもない、型valuesについて説明します。 命令valuesではなく、型valuesの方ですので注意。 型とは、…

warnの出力抑制はどうやって実現しているのか

warnの出力を抑制する方法 (handler-bind ((warning #'muffle-warning)) (warn "Hello")) やった! warn関数とその周辺の実装を考える Common Lispのwarningの話題です。 warn関数では警告を出力できますが、 その出力を抑止したい場合はどうしたらいいでし…

rationalizeのアルゴリズムが全く分からなかった

Common Lispの関数rationalizeの話題です。 関数rationalizeとは、浮動小数を分数に変換する関数です。 例えば浮動小数の0.1を分数に直すと次のようになります。 * (rationalize 0.1) 1/10 実は浮動小数の0.1を1/10に変換するって難しい事なのです。 0.25を1…

closureには何が保存されるのか

closureとは関数にデータを保存するための仕組みです。 Lisp大好きな人はlambdaと一緒に多用します。 例えばこんな使い方をします。 (let ((x 0)) (setq *call* (lambda () (incf x)))) (funcall *call*) -> 1 (funcall *call*) -> 2 (funcall *call*) -> 3 …

分数の割り算で余りを求める

分数の割り算で、余りを求める方法がわからなかったという内容です。 どうも小学校の算数の内容らしいですが、わからなかったのだから仕方がない。 あと「帯分数」というモノを初めて知りました。 習った記憶が全くない。 Common Lispでは、truncate関数を使…

Common LispとC言語で虚数部のゼロ符号に違いが出る

ずっと悩んでいたことがわかったのでメモします。 例えば下記の関数 log(1-z) のzに10を入れると、Common LispとC言語では結果が違います。 Common Lispの例 (defun log1-z (z) (log (- 1.0 z))) (log1-z 10) -> #C(2.1972246 3.1415927) C言語の例 #include <stdio.h></stdio.h>…

整数を英語で表現する4(序数と負数)

最後に、序数と負数について説明します。 序数 数が0~19までの序数はすでに表に出しています。 例えば13は下記の通り。 * (format t "~:R" 13) thirteenth 20以上の場合、例えば43は次のようになる。 * (format t "~:R" 43) forty-third 40であるfortyは通…