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 モジュールをロード:
変数 sys
は Sys
型。
Sys
は Module
型から派生している。
Sys
には open
、 read
、 write
、 print
などのシステム関数が含まれている。
じゃあこれはなんなのかっていうと:
1
|
include "sys.shl" as Sys;
|
sys.shl
をインクルードしている。
sys.shl
は多分こういう感じの内容で:
1
2
3
|
module Sys {
print(format_or_value : string, ...);
}
|
シグネチャしかないため、 load
する必要があると思われる。多分……。
それだったら、以下のようにしても良いんじゃないかって思うけど……。
1
|
% sudo vim /etc/locale.gen
|
vim とかで編集して、 ja_JP.utf8
をコメントインする。
を実行して有効にする。
1
|
% localectl set-locale LANGUAGE=ja_JP.utf8
|
localectl
を使って ja_JP.utf8
を選択する。
あとは再起動すれば日本語化されている。
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 は 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
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
----------------
|
なぜかと言うと、以下のように 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-ncurses
の ncurses.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
つこおてるんだったら
こうでも良いんじゃないかって思うんだけれどもやってないんだろうか……。
ql:quickload
した後は require
できるらしい。
この辺こんな風に(キーワードは違うにせよ)書ける言語もあるんだけど、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-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"))
|