nptclのブログ

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

2019-01-01から1年間の記事一覧

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-…

amd64ユーザーランド(とりあえず実行)

amd64の機械語を勉強していきます。 本投稿はnptに最小限のamd64コンパイラを実装できるか検討したときのメモです。 まあ結局nptでamd64コンパイラは実装しないんですけど。 ユーザーランドとは、つまり一般ユーザーが作るプログラムのことです。 OSを作るわ…

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

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

FreeBSD 12にOpenSMTPDを入れたかった

昔はこうやって入れていました。 # portsnap fetch update # cd /usr/ports/mail/opensmtpd # make ===> opensmtpd-5.9.2p1_6,1 is marked as broken: Incompatible with Openssl 1.1.x yet. *** Error code 1 Stop. make: stopped in /usr/ports/mail/opens…

Nptで把握している問題点

npt

いま現在問題と思っていることを列挙します。 書いておかないと本人が忘れるので。 これは、問題と確定しているわけではなく、 問題があるかどうか調査することから必要があるものです。 標準入出力のリダイレクトが非常に遅いのはなぜか調べる。 例えばこん…

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…

C言語のconstの使い方

今までconstの書き方がよくわかっていませんでした。 で、調べたら予想以上に難しかったです。 本投稿ではconstの使い方を記載していくわけですが、 規約を調査したわけではなく、Cコンパイラで実験した内容です。 もしかしたらおかしい所があるかもしれませ…

整数を英語で表現する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関数では警告を出力できますが、 その出力を抑止したい場合はどうしたらいいでし…

非正規化浮動小数の有効桁数を求める

C言語にてCommon Lispのfloat-precision関数を作成したときのメモです。 非正規化の浮動小数とは、値が小さすぎるけど何とかして 浮動小数にて表現したいというギリギリの場合の方法です。 感覚としては、 1.23456 × 10の-103乗 みたいに表現したいけど指数-…

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

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