プログラミング言語 Sheol

May 1, 2021

Limbo をインスパイアしたプログラミング言語 Sheol のへろーわーるど:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
include "sys.shl" as Sys;
include "draw.shl";

module Hello {
    init(self : ref Draw.Context, argv : list[string]);
}

init(self : ref Draw.Context, argv : list[string]) {
    sys = load Sys;

    sys->print( "Hello, World!\n" );
}

ここで Sys モジュールをロード:

1
sys = load Sys;

変数 sysSys 型。
SysModule 型から派生している。
Sys には openreadwriteprint などのシステム関数が含まれている。

じゃあこれはなんなのかっていうと:

1
include "sys.shl" as Sys;

sys.shl をインクルードしている。

sys.shl は多分こういう感じの内容で:

1
2
3
module Sys {
    print(format_or_value : string, ...);
}

シグネチャしかないため、 load する必要があると思われる。多分……。

それだったら、以下のようにしても良いんじゃないかって思うけど……。

1
Sys = load 'sys.shlm';

Ubuntu の日本語化

Oct 25, 2020
1
% sudo vim /etc/locale.gen

vim とかで編集して、 ja_JP.utf8 をコメントインする。

1
% sudo locale-gen

を実行して有効にする。

1
% localectl set-locale LANGUAGE=ja_JP.utf8

localectl を使って ja_JP.utf8 を選択する。 あとは再起動すれば日本語化されている。

Docker Descktop for Windows をインストールしてみた

Oct 17, 2020

https://hub.docker.com/editions/community/docker-ce-desktop-windows からインストーラーをダウンロード。

WSL2 をバックエンドとして Docker Descktop for Windows を実行していると、WSL のディストリビューション一覧は以下のようになるらしい:

1
2
3
4
5
PS C:\Users\alice> wsl -l -v
  NAME                   STATE           VERSION
* Debian                 Running         2
  docker-desktop         Running         2
  docker-desktop-data    Running         2

実際にコンテナが動作することを検証するために、今回は Amazon Linux 2 のイメージを Docker Hub から pull って実行するっぽい。

https://hub.docker.com/_/amazonlinux

docker pull でイメージを引っこ抜いてきて、 docker run でイメージを実行する感じなんだろうか…。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
PS C:\Users\alice> docker pull amazonlinux
Using default tag: latest
latest: Pulling from library/amazonlinux
37373184fe69: Pull complete
Digest: sha256:2c99363fc74d3a39f02365b964e73cceb2b2524c00e9977e16680156e2f79ee8
Status: Downloaded newer image for amazonlinux:latest
docker.io/library/amazonlinux:latest

PS C:\Users\alice> docker run -it amazonlinux
bash-4.2# cat /etc/image-id
image_name="amzn2-container-raw"
image_version="2"
image_arch="x86_64"
image_file="amzn2-container-raw-2.0.20200722.0-x86_64"
image_stamp="3280-5fdd"
image_date="20200724160117"
recipe_name="amzn2 container"
recipe_id="17c5a58e-d7e0-fa2e-e80a-ccb0-2623-a6a5-fa48d402"

run -it <イメージ名> とすると、その場で <イメージ名> が実行できるらしい。

Docker コンテナの実行状態?は ps サブコマンドで確認できるらしい:

1
2
3
PS C:\Users\alice> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
c31352b5b45b        amazonlinux         "/bin/bash"         4 minutes ago       Exited (0) About a minute ago                       awesome_lederberg

終了したから Exited ってなってるけど、動作してることが確認できたっぽい。

Fluff 言語入門

Oct 16, 2020

この架空言語入門は ここ を参考にして書かれました。

概要

  • Fluff は FLVM という仮想マシンの上で動くよ!(そのはず)
  • Fluff タイプ・チェッカーっていうのがあるよ!(Fluff パッケージ/ビルドに含まれているはず)
  • オプションで Fluff 対応エディタ、 vscode-fluff がインストールされた VSCode がオススメ(したい)

最初の Fluff コード

Fluff のインストール

Fluff のインストール方法については Fluff スタートガイドをご覧ください。

Fluff をインストールすると Fluff タイプ・チェッカーが使用できるようになるため、実行する前にコードを静的にチェックすることができます。 これはコンパイラではありません。 むしろ、コードの実行中、または実行後ではなく、実行前に動的プログラミングエラーを補足しようとする超高速コードアナライザーです。

タイプチェッカーは fl-analyzer と呼ばれます。 fluff パッケージに付いてくる予定です。

Fluff タイプ・チェッカーの設定

それでは Fluff コードを保存するディレクトリを選択します。 このディレクトリで fl-analyzer init と実行するか、 touch .flconfig と実行してください。 これによって fl-analyzer がタイプ・チェックするコードのルートとして検索する空のファイルが作成されます。

コードを適切に分析するには、タイプ・チェッカーがグローバル分析を実行し、全てのコードを見ることができるようにする必要があります。

最初の Fluff プログラムを書く

あなたがお好きなテキストエディタ(Emacs、Vim、VSCode などで)を使用して次のコードで first.fl というファイルを作成しましょう:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
namespace Fluff::GettingStarted::MyFirstProgram;

[__EntryPoint__]
function main() : void {
    say "Welcome to Fluff!\n\n";

    ::printf( "Table of Squares\n"
        "----------------\n");

    for ( let i = -5; i <= 5; ++ i ) {
        ::printf( "  %2d       %2d  \n", i, i * i );
    }

    ::printf( "----------------\n" );

    exit( 0 );
}

このガイドはぷろぐらみんぐの知識があることを前提としています。 Fluff のルックアンドフィールは C++ と非常に似ていますが、C や C++、C#、Java、JavaScript、Perl、Raku で共有される多くの構文をサポートしています。 この例について注意すべき重要なポイントは次のとおりです:

  • このコードは Fluff::GettingStarted::MyFirstProgram という一意の任意の名前空間に属しています。
  • main は引数を持たない関数であり、戻り値の型は void であるため、値を返しません。 更にこの関数はプログラムが実行を開始する場所です。つまり、 main はエントリ関数です。
  • say は文字列と改行を標準出力に書き込みます。
  • printf も標準出力に書き込みますが、この場合、整数列を右揃えにするためのフォーマット制御を提供します。
  • for ループの変数 i は -5 から 1 ずつ加算されて最終的には 5 になり、反復ごとに i の値とその 2 乗された値が別々の行に一緒に書き出されます。

タイプ・チェッカーを実行する

VSCode で vscode-fluff{.verbatim} を使用している場合などはコードを書く時にタイプ・チェック情報が表示されます。(多分) コマンドラインからタイプ・チェッカーを実行する場合、コマンドは次のとおりです:

1
$ fl-analyzer ./first.fl

するとこのように表示されます:

1
Syntax OK

コードを実行する

コードをエラーなしでタイプ・チェック・クリーンにした後、次のようにコードを実行することができます:

1
$ fluff ./first.fl

出力は次のとおりです:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
Welcome to Fluff!

Table of Squares
----------------
  -5       25
  -4       16
  -3        9
  -2        4
  -1        1
   0        0
   1        1
   2        4
   3        9
   4       16
   5       25
----------------

cl-charms がいんすとろーるできない

Oct 2, 2020

なぜかと言うと、以下のように ncurses.h をインクルードしようとしているから。

~\.roswell\lisp\quicklisp\dists\quicklisp\software\cl-charms-20200218-git\src\low-level\curses-grovel__grovel.c:6:10: fatal error: ncurses.h: No such file or directory
    6 | #include <ncurses.h>
|          ^~~~~~~~~~~
compilation terminated.

それで MINGW64 における ncurses であるところの mingw-w64-x86_64-ncursesncurses.h が以下のように:

$ pacman -Ql mingw-w64-x86_64-ncurses | grep 'ncurses.h'
mingw-w64-x86_64-ncurses /mingw64/include/ncurses/ncurses.h
mingw-w64-x86_64-ncurses /mingw64/include/ncursesw/ncurses.h

少なくとも ncurses/ncurses.h に置かれているので、

$ pkg-config --cflags ncursesw
-D_XOPEN_SOURCE=600 -D_POSIX_C_SOURCE=199506L -ID:/msys2/mingw64/include/ncursesw

pkg-config からもわかるように

1
#include <ncursesw/ncurses.h>

ってやらなくちゃいけないっていうか、 pkg-config つこおてるんだったら

1
#include <ncurses.h>

こうでも良いんじゃないかって思うんだけれどもやってないんだろうか……。

require って何なの?

Oct 2, 2020

ql:quickload した後は require できるらしい。

1
  (require :cl-charms)

定数の初期化の話

Sep 30, 2020

この辺こんな風に(キーワードは違うにせよ)書ける言語もあるんだけど、JS はダメなのよね。

1
2
3
4
5
6
7
8
const x;
if (cond) {
    // 一回だけ代入可
    x = hoge;
} else {
    x = fuga;
}
// x が初期化されていないパスがある状態でここで x を使うとエラー

たしかに。
上記しかなかったら、こういう風に書くよね:

1
const x = cond ? hoge : fuga;

Scheme だとこういう風に書ける:

1
2
3
(define-constant x (if *cond*
                       hoge
                     fuga))

あんまり変わらないけど…。

えーと

よく見ると、定数の初期化の話ではない……?

つまり、const は変数への 1 回だけの代入を許すみたいなものがある言語もあるけれども、JavaScript では最初に代入しないと Syntax Error になってしまう。 みたいなことか。

こういうエラーが出た:

$ deno run ./demo000.js
error: Uncaught SyntaxError: Missing initializer in const declaration
const x;
    ^
    at <anonymous> (file:///D:/home/rihine/workspace/2020-09-30/demo000.js:1:7)

UIM の現在の入力方式を得る

Apr 27, 2020

以下のようにやればいいことが分かった:

% uim-sh -e default-im-name
mozc

Emacs Lisp では以下のように書く:

1
2
;; string-trim-right は (require 'subr-x) して使う。
(string-trim-right (shell-command-to-string "uim-sh -e default-im-name"))