Chez Scheme and ...

スーパーへ行ったら、地元農家のコーナーに、葉付きの大根が置いてあった。普段は見かけないに珍しい。流通に不便、消費者に嫌われるって事で、事前に捨ててしまっているんだろうね。

女房も目ざとくみつけて、みそ汁に入れるだとか、じゃこと炒めるだとか、嬉々とした表情でお買い上げ。そうだよ、もったいない。

柿を剥いて残った皮も、漬物に入れたりしてるからね。今年の柿は少々色付きが悪い。先月の日照不足がたたっているんですかね。へたの側がやや青い。農家の人がやってるように、地面に反射板を置いて、日焼けさせればいいんだな。

ここら辺は、あちこちに、たわわに実った柿の木が有るけど、だれも取らないなあ。鳥さん達へのプレゼントと心得ているのかな。

そうそう、もったいないと言えば、ネギの青い部分。使い道が無いと言って、さすがの女房も捨てていた。禅寺の和尚さんと思って、レシピを提案してみるかな。ネギの本場の方に聞くのが一番だろうけど、取り合えず全国のみんなに聞いてみる。

捨てたらもったいない! ネギの青い部分フル活用レシピ

葉ネギの油炒め。 レシピ・作り方

こういう分野はクックパッドの独壇場かと思ってたら、携帯だけじゃ飽き足らずに三木谷さんこういう分野にも進出してきてるのね。まあ、通販を増やすにはこういうのも必要ってのは頷けますよ。

有理化

前回maximaをやってた時、仮数の非常に大きい浮動小数を、いとも簡単に有理化してくれちゃった。これって、どういう仕掛けなの?

Scheme:非正確な整数

浮動小数点数型と誤差

それはいいんだけど、オイラーの知りたいのは、浮動小数をどうやったら有理化出来るかだ。 そんなキーワードを散りばめて見つけたのは上記。でも知りたいのは違う。

もっと素直に小学生並みになって質問した。

小数を分数にするやり方

ふむ、取り合えず分数化しておいて、後は約分しろとな。約分って、分子と分母を同じ数で割るって、習ったな。

例えば、0.15 を分数化。15/100 これを約分。

julia> gcd(15,100)
5

分子、分母共、5で割りきれる。だから、結果は、3/20 となる。分かってしまえばなーんだけど、改めてオイラーの頭は小学生並みと証明されてしまったわい。

julia> rationalize(0.15)
3//20

検算しろって、教わったでしょ。

Chez Scheme

schemeでもコンパイル出来るやつが欲しい。何たって世はjitとか流行ってますからね。Common Lispに負けるな。(前回までやってた、CLの唯一の有名なアプリmaximaを忘れたか。少しは敬意を払えよ。)

そんな事、言わんといてや。やりたいものはしょうがない。schemeでコンパイル出来るやつって、チキンとかビッグなんとかとかgambitとか、もう一つあったな。ほら、あれですよ。

脳科学者に言わせると、固有名詞を忘れるのはしょうがない。問題は普通名詞を忘れる事だと言う。スプーンとかおしゃもじとかだね。おしゃもじ、ご飯をよそう道具って脳に記憶されてるんだけど、この糸が切れてしまうのは、とても問題だそうだ。

で、件のもう一つ、連想記憶にキーが残っていた。あれを起動すると、ciscoのマークが出てきたんだよな。それだけのキーが有れば、ググルさんが抽出してくれるだろう。オイラーのHPのアクセス状況をたまに点検するんだけど、押し寄せて来るのはロボットばかりですから、もう十分に補足されているだろう。

cisco scheme site:hamesspam.sakura.ne.jp/

こんなSQLもとえ、検索語を発したら、2件引っかかってきた。2016年以来やってないから、3年ぶりだね。某Linux雑誌は、隔月で同じ事を繰り返しているから、それに比べたら、十分に許される範囲でしょう。

Chez Scheme (git)

まずはCentOSに入れてみる。

(base) [sakae@c8 ChezScheme]$ ./configure --installprefix=/usr/local --threads --64

こんな設定かな。コンパイルを開始したら、ある所で、uuid/uuid.hが見つかりませんでってエラー発生。毎回こういうのに出くわす。Linuxの担当者出て来い。小一時間説教してやるから。

何故こんな意地悪するの? ヘッダーが無ければ、悪い人が入ってきても悪いアプリを設置出来ないでしょ。もっともらしい回答だけど、騙されてはいけない。ヘッダーが所定の場所になくても、手持ちの物があれば簡単にコンパイル出来ちゃうからね。

それに悪いアプリはpython小僧が簡単に動かせますから、抑止力にはさっぱりなりません。せいぜい、たこ を育てる為の試練ですぐらいかな。それにしたって、最近はbuild-depsだかのコマンドをちょいと叩くだけで、ヘッダーから必要なツールから簡単に準備出来ちゃうから、難の足し(引きか)にもなりません。

そろそろ、ヘッダーは標準で添付してよ。Diskの容量がもったいないなんてのは、即却下ですからね。BSD系OSに出来てLinuxに出来ないはずは無い。

と、ぶつくさ言いながら、下記のクエリーを発行するのでありました。

(base) [sakae@c8 ~]$ dnf provides /usr/include/uuid/uuid.h

無事に動いたので、32Bit機のdebianにも入れたよ。

debian:examples$ petite
Petite Chez Scheme Version 9.5.3
Copyright 1984-2019 Cisco Systems, Inc.

>
debian:examples$ scheme
Chez Scheme Version 9.5.3
Copyright 1984-2019 Cisco Systems, Inc.

前にやった時は、Version 9.4 だったから、少しは進んでますなあ。それにlibX11問題も解消されてる。

それはいいんだけど、emacsから使うようにはなっていない。ってか、昔は *.el が付属してたような気がするんだけど、勘違いかな。しっかりアプリの中でeditorが提供されてる。下手に*.elなんて提供すると、サポートの負荷が上がるんで、提供を止めたんだろうね。

でも、lispにしろschemeにしろ、昔から括弧系を扱うのはemacsって決まってた。きっと好き者がゲリラ活動してるに違いない。ちょっとぐぐってみるか。

Chez Scheme and Emacs

こんな人が居た。Macったらおしゃれーな人だから、geiserってのがトレンドなのだろう。流行に後れるな。

Geiser manual

Geiser cheat sheet

何も設定しないで起動したら、ソースバッファーのモードがraketになってた。気にいらん。 マニュアルを斜め読みして、

;; Chez scheme
;; (setenv "CHEZSCHEMELIBDIRS" "/home/sakae/scheme/lib:")
;; (setenv "CHEZSCHEMELIBEXTS" ".sc::.so:")
;; (setq geiser-active-implementations '(chez))
(eval-after-load "geiser-impl"
  '(add-to-list 'geiser-implementations-alist
                '((regexp "\\.ss$") chez)
                '((regexp "\\.rkt$") racket)))

こんな設定をした。M-x run-chez すると、画面が割れてreplが出て来る。(or C-c C-z)

debian:geiser-20191023.424$ ls scheme/
chez/  chibi/  chicken/  gambit/  guile/  mit/  racket/

こんなscheme系をサポートしてるって事は、scheme系のslimeもどきだな。まだ、使い込んでいないので、十分に似てるかどうかは、分からんけど。

racket

もう一つ、jitするやつが有ったな。scheme界の風雲児。独自路線でガンガン拡張。ちょいと 大変そうな奴。

Racket solve problems · make languages

CentOSに入れてみる事にした。debianのパッケージが源流みたいだけど、そこはそれ、どんなLinuxにも拡散すべくshスクリプトの後ろにデータを背負った形で提供されてた。

インストール時に、bin,lib等を拡散させるか、一か所にまとめるか選択出来るようになってた。迷わずに一か所方式を選択。こうしておけば、消すのは非常に簡単。

geiserからも無事に動いた。

Welcome to Racket v7.4.
racket@>
ps awocmd
emacs hoge.ss
/usr/local/racket/bin/racket -i -q -S /home/sakae/.emacs.d/elpa/geiser-20191023.424/scheme/racket/ -f /home/sakae/.emacs.d/elpa/geis
psからだと途中で切れちゃうので、/procからの情報も参照
cat /proc/3650/cmdline
/usr/local/racket/bin/racket-i-q-S/home/sakae/.emacs.d/elpa/geiser-20191023.424/scheme/racket/-f/home/sakae/.emacs.d/elpa/geiser-20191023.424/scheme/racket/geiser/startup.rkt(base)

C-c C-d C-d でシンボルを調査。そこから定義元のソースを参照出来る。

racket on debian

調子こいて32Bit機のdebianにもracketを入れようとしたんだ。が、Linuxの32Bit版だけのけ者にされてて、パッケージが無い。今時Linuxを32Bitで使うなんて小数者だから無視なんだな。Macは32Bit用が提供されてるって、一応主流なOSって位置付けなんでしょうな。

しゃーない、ソースはあるんで、自分で何とかする。README.txtを見ると

========================================================================
 Traditional Racket versus Racket-on-Chez
========================================================================

This source directory contains implementations for two different
versions of Racket: the traditional implementation that is
substantially implemented in C, and an implementation that builds on
Chez Scheme.

Traditional Racket
------------------

By default, `configure` and the Windows scripts build the traditional
implementation of Racket.

If you need more information specific to the traditional
implementation of Racket, see "racket/README.txt".

Racket on Chez Scheme
---------------------

To build Racket-on-Chez on Unix variants or Mac OS:

 * ... in addition to the traditional variant of Racket: supply
   `--enable-cs` or `--enable-csdefault` to `configure`.
      :

ってな事が書いてある。従来通りのC語で書かれたやつにするか、Chezとコラボレーションした物を作るか選択出来る。

src/csの中にはChezと協調する為のコードが置かれていた。但しChez Schemeは自前で用意してねって事だ。そして、このコラボ版は、まだ実験段階、人柱希望の人はどうぞって位置付け。 オイラーは、昔ながらの方式を選択したよ。

makeはまああっさりと10分ぐらいで終了。make installしたら、さっぱり完了しない。racoとか言うパッケージマネージャーが一生懸命にパッケージを作っていた。結局終了まで、1時間半ぐらいはかかったかな。

debian:~$ ls -ltr /usr/local/bin
  :
-rwxr-xr-x 1 root  root   4064884 Nov  8 05:53 racket*
-rwxr-xr-x 1 root  root       179 Nov  8 07:06 raco*
-rwxr-xr-x 1 root  root      1633 Nov  8 07:06 drracket*
-rwxr-xr-x 1 root  root      1610 Nov  8 07:06 plt-games*
-rwxr-xr-x 1 root  root       202 Nov  8 07:06 mzc*
-rwxr-xr-x 1 root  root       199 Nov  8 07:06 setup-plt*
-rwxr-xr-x 1 root  root       210 Nov  8 07:06 mzpp*
-rwxr-xr-x 1 root  root       197 Nov  8 07:06 plt-r5rs*
-rwxr-xr-x 1 root  root       212 Nov  8 07:06 mztext*
-rwxr-xr-x 1 root  root       197 Nov  8 07:06 plt-r6rs*
-rwxr-xr-x 1 root  root       201 Nov  8 07:06 scribble*
-rwxr-xr-x 1 root  root       211 Nov  8 07:06 slatex*
-rwxr-xr-x 1 root  root       215 Nov  8 07:06 pdf-slatex*
-rwxr-xr-x 1 root  root      1638 Nov  8 07:06 slideshow*
-rwxr-xr-x 1 root  root       192 Nov  8 07:06 swindle*
-rwxr-xr-x 1 root  root       204 Nov  8 07:06 plt-web-server*
-rwxr-xr-x 1 root  root      2029 Nov  8 07:47 mred-text*
-rwxr-xr-x 1 root  root     25997 Nov  8 07:47 mred*
-rwxr-xr-x 1 root  root      2029 Nov  8 07:47 gracket-text*
-rwxr-xr-x 1 root  root      2024 Nov  8 07:47 gracket*
-rwxr-xr-x 1 root  root     25978 Nov  8 07:47 mzscheme*
-rwxr-xr-x 1 root  root       608 Nov  8 07:47 plt-help*
debian:~$ racket
Welcome to Racket v7.4.
> (quit)
; quit: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
; [,bt for context]
> ,bt
; quit: undefined;
;  cannot reference an identifier before its definition
;   in module: top-level
> (exit)

物によってquitだったりexitだったりして、煩わしいな。 それから役に立たないmanがあって、racket --help しろですって。近頃の風潮と来たら(以下自粛)

それはそうと、随分と沢山のコマンドがインストールされたな。サイズが極小のやつはスクリプトだろうね。適当に開いてみた。

debian:bin$ cat raco
#!/bin/sh
# This script was created by make-mzscheme-launcher

# {{{ bindir
bindir="/usr/local/bin"
# }}} bindir

exec "${bindir}/racket" -N "$0" '-l-' 'raco/main.rkt'  ${1+"$@"}

他も大体こんな感じ。racketが親分で、それぞれもコードを起動してる。今後皆様の御要望を賜り、誠意拡張してまいります。(水膨れ作戦)そのうちにraket版のgrepを作りましたとか、WindowsでWSLは宗教的理由により入れたく無い人用に拡張されるに違いない。

そう言えば、かのrms師は、/bin/shを廃してguileを普及させようと画策してたけど、目論見は頓挫しちゃったみたいですな。

debian:bin$ raco -help
/usr/local/bin/raco: A flag must follow a command: -help

Usage: raco <command> <option> ... <arg> ...

Frequently used commands:
  docs                 search and view documentation
  make                 compile source to bytecode
  setup                install and build libraries and documentation
  pkg                  manage packages
  planet               manage Planet package installations
  exe                  create executable
  test                 run tests associated with files/directories

A command can be specified by an unambiguous prefix.
See `raco help' for a complete list of commands.
See `raco help <command>' for help on a command.

よく使われるコマンドを列挙しましたとな。詳しくは、raco help しろとな。実行ファイルも作成出来るんか。増殖用に用意しましたとな。

debian:bin$ locate raco/main.rkt
/home/sakae/src/racket-7.4/collects/raco/main.rkt
/usr/local/share/racket/collects/raco/main.rkt
debian:bin$ ls /usr/local/share/racket/collects/raco/
all-tools.rkt     compiled/  info.rkt     main.lch  raco.1
command-name.rkt  doc.ico    main.extreg  main.rkt  raco.rkt

ふーん、collectsって所に寄り集まっていて、そのそれぞれにcompiledが有って、実行に便利な形式で置いてあるんだな。

debian:bin$ ls /usr/local/share/racket/collects/raco/compiled/
all-tools_rkt.dep  command-name_rkt.dep  info_rkt.dep  raco_rkt.dep
all-tools_rkt.zo   command-name_rkt.zo   info_rkt.zo   raco_rkt.zo

zoがバイナリーなんだろうね。

guile 2.2

Guile

後ろ姿は、ダエモン君に似てる? いや、バッファローの仲間だろう。

debian:~$ guile
GNU Guile 2.2.4
Copyright (C) 1995-2017 Free Software Foundation, Inc.

Guile comes with ABSOLUTELY NO WARRANTY; for details type `,show w'.
This program is free software, and you are welcome to redistribute it
under certain conditions; type `,show c' for details.

Enter `,help' for help.
scheme@(guile-user)>

(quit) でも (exit) でも抜けられる所が偉い! さすがに (bye) したらdebuggerに 落ちてくれたけど。

geiserからもguileを呼び出せるように設定したよ。racketと同様に起動してくるまで、若干のもたつきがあるな。ダントツで速いのはchezでした。

gambit on OpenBSD

OpenBSDでもgeiserを味わってみたくて、gambitを入れたよ。問題なく動いた。それではおまけと思って、pkgになってる chickenも組み込んでみた。こんなREPLが出てきた。

CHICKEN
(c) 2008-2019, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 5.1.0 (rev 8e62f718)
openbsd-unix-clang-x86-64 [ 64bit dload ]

#;1>

所が問題発覚。scheme buffer側でソースを評価しようとC-x C-e するも、mini-bufferには、C-x C-e と表示されるだけで、結果が出てこない。何でかな?

gauche info

geiserを入れたら、先住者のgoshがemacsから呼び出せなくなった。

(setq inferior-scheme-program "gosh")

この設定がgeiserに乗っ取られてしまっている風です。scheme界のslimeは強いですって結論かな。

gaucheがemacsから使えないのは悲しいので、vboxに入れてるdebianのバックアップ機(何のこっちゃ?)に、gaucheを入れる事にした。今回は、configを始める前にslibを入れておいた。そしたら懐かしいscm(と言うscheme)も一緒に入った。

が、大事なinfoが作成されていない。何故? 本番環境のdebianで残骸を調べてみたよ。

make gauche-refj.texi and gauche-refe.texi して、原稿を日英に分解。それからinfoを下記のようにして作る。

debian:doc$ make
../src/gosh -q -ftest ./makedoc.scm info gauche-refe.texi "makeinfo" "gzip"
../src/gosh -q -ftest ./makedoc.scm info gauche-refj.texi "makeinfo" "gzip"

ああ、Makefileの穴埋め問題だった。

MAKEINFO     = makeinfo

勿論 /usr/bin/makeinfo が必要。気を良くしたオイラーは、make htmlしたよ。gauche.refj.htmlと言う、巨大なやつが出来上がったので、WindowsのDesktopに飾ったよ。英語版も出来ていたけど、日本語好きですから。。。