Lisp の人の言質はだいたい典型的な特徴があり、自賛と懐古的な礼讚が7割入るので、9 割引で信用するとして、残りがよくわからないので、自分もそっちに λ ってみるしかない。
ラムダ
Android で 64bit アーキテクチャの Arm CPU で common Lisp ぽいことをやろうとすると今のところ唯一 hy だけ方法がわかる。現時点でまったくよく知らないが、hy は clojure に影響を受けているので、その両者は、よくにているはず。clojure の古い本をパラパラ見てみると、python よく知ってても全然わからんかもよというように書いているので、python から clojure へ向かうのに hy へトラバースしてから登っていくのは近道かもしれない。プログラミングってよくわからないので、一つ二つの用途の単純なプログラムを 4 ヶ月くらいの間に 6 つの言語にスライドして翻訳しては書き直していると、だいたい同じで、なんか大幅に違う Lisp に関心をもったという動機なので、Lisp ぽい語順にまずは慣れたい。
Common Lisp アプリでは CL REPL (ecl)が動くが(これイイ!)。
termux では 32bit だと ecl が動くらしいが、64bit cpu ではエラーになった。他にも debian や ubuntu をセットして、そこへビルドする等、実践しているという情報はあるが、Lisp 側に変更点がなくともホスト側が日々変更があり今日どのようにするのか調べて実践するのには数日間かかる(数十日でも、わからないまま)。
非公式のパッケージで Racket はあるが、Arm cpu 64bit (OS 32bit モード)の Fire HD 10 ではエラー ;cannot locate symbol "ffi_type_uint32"
(たぶん他のデバイスでは動くのでは?と期待しているけど調べられぬ)。たんに無いというのはセットアップ bash の path が違うだけなのだろうか(これはクロスコンパイルして、そのレシピを作った人の認識している環境の範囲外で起こることだと思う)。不明。
2021.12.24 時点では racket は termux の公式パッケージに存在する。そして同上 Fire OS でもエラーにならなかった。
tinyscheme
という scheme はエラーにならなかった。
hy lang
hy ではなくまた別の python にアダプテッドしている scheme のドキュメントに説明が書いてある。
https://hissp.readthedocs.io/en/v0.2.0/faq.html
他の Lisp だと計算機科学のカリキュラムと理想というレールの本の足し算から始まって、インタプリターの実装という定番らしい世界観の道筋があり、ある程度そのコースに委ねて 1987 年くらいまでレイドバックして進まないと見えてこないが、hy の場合は python のコード内容をほぼそのまま Lisp 風の語順の文法にする練習から始められるので、自分の解っていることと対比して現在現時点の世界とパラレルで手探りで進められる。(数十日委ねた. 初めての人のためのLISPを図書館で見つけて、開いて、5分で閉じた. そこでモチベーションのかなりを失った. )
現在現時点 .... たとえば、最低限 https で get リクエストするところからのスタートで、それ以上の機能至上主義話からでもなく、足し算の仕方でもないところ。今現在、あたりまえにできることをどうやるのか、というところから。
という emcs の hy モードのコマンド。
(hy-mode)
Parent mode: ‘prog-mode’.
Major mode for editing Hy files.
In addition to any hooks its parent mode ‘prog-mode’ might have run,
this mode runs the hook ‘hy-mode-hook’, as the final or penultimate step
during initialization.
key binding
--- -------
C-c Prefix Command
ESC Prefix Command
DEL backward-delete-char-untabify
C-M-x hy-shell-eval-current-form
C-c C-b hy-shell-eval-buffer
C-c C-d Prefix Command
C-c C-e hy-shell-eval-last-sexp
C-c C-r hy-shell-eval-region
C-c C-t hy-insert-pdb
C-c C-z run-hy
C-M-q indent-sexp
C-M-q prog-indent-sexp
(that binding is currently shadowed by another mode)
C-c C-d C-d hy-describe-thing-at-point
C-c C-d d hy-describe-thing-at-point
メリットとしては、色分けしてくれる。
Tmux などで画面分割して hy ファイルエディットと、hy repl の動きを同時にモニターしつつファイルを更新していくのと変わらないと言えば、そうかもしれない。
emacs を REPL として使っている。(Control key) c, (Control key) b
のコマンドで hy のバッファーが RELP に渡されるようだ。コマンドを実行すると、新たなバッファーに python プログラムコードに変換されたものが現れて、実行される。python は読めて、Lisp は知らないという人にとって、変換された python コードの時点で思っているのと違っていたら Lisp(hy)文法上の間違いというデバックができる(逆の場合必要ないかもしれない)。マクロというのもこのコマンドで実行された(当然なのかもしれないけれども、わたしは現時点でマクロが何してくれるナニをまったく知らない。マクロ式を評価するとコンパイル中というか python 翻訳中に一回なんかしてくれる)。
print("改行なし",end="")
hy の場合の python の NoneType のチェックにかなり注意が必要。none?
,empty?
は hy にかつてはあったけど、今無いのかもしれない(古いバージョンのドキュメントには記載されているが、実際プログラムに書いても定義されていなかった)。is None
は載っていない。
rf.https://github.com/hylang/hy/releases
(if (do (is (re.search r"(?<=\]\s).+?(?=\&)" (get m_title 0)) None))
(do
かな。いや?
(setv m_title2 (re.search r"(?<=\]\s).+?(?=\&)" (get m_title 0)))
(if m_title2 ; コレでも期待する通りにはなる
(do
(print "check1")
(setv s_title1 (get m_title2 0))
(setv m_author (re.search r"(?<=^\[).+?(?=\])" (get m_title 0)))
(setv s_author (get m_author 0)))
(do
(print "check2")
(setv m_title1 (re.search r"^.*?(?=\&)" (get m_title 0)))
(setv s_author "?")
(setv s_title1 (get m_title1 0)))
というようなところに何時間かハマる。いやっもっとずっと。この場面での progn とは?
https://docs.hylang.org/en/master/tutorial.html#basic-operations
What if you want to use more than form in place of the THEN or ELSE clauses, or in place of CONDITION, for that matter? Use the macro
do
(known more traditionally in Lisp asprogn
), which combines several forms into one, returning the last:
progn
あと、import
文の書き方なども、これはどうするんだろう?
Python の場合。
import re
import requests
import sqlite3
import os
import sys
from bs4 import BeautifulSoup
Hy こうなった。
(import re)
(import requests)
(import sqlite3)
(import os)
(import sys)
(import [bs4 [BeautifulSoup]])
;########################################
(setv url (get sys.argv 1))
;url = sys.argv[1] # 'https://somewhere.org/'
;########################################
(setv response (requests.get url))
;response = requests.get(url)
(setv html_text response.text)
;html_text = response.text
(setv soup (BeautifulSoup html_text "html.parser"))
;soup = BeautifulSoup(html_text,'html.parser')
(setv title soup.title.string)
;;(setv title (.find_all soup "title"))
;title = soup.title.string
(print title)
;print(title)
ひじょうに難解な、すごい言語を習得しようとしているというよりも、パズルのように文の語順をルールに則って組み換えるゲームをしていると思うと楽しい。というよりも、難解なことしなければいいと思うだけで、シンプルに見える。
ロゼッタが python で、python のこともよくは知らないから、形態素に分解してピースの一個一個を調べて填まるかどうかやっている感じ。
まぁ片方の python は完全に動くので、そこに Brood parasite (托卵)されてるカッコ言語を通じるかどうか話している。Ruby にも感じたが、「文章」という感じなので、もし仮に C 言語のような書き方について馴染みがなければ、逆にこっちの方が理解しやすいかもしれない。
Ruby の場合は、古に本のなかだけで見ていた日本語ベーシックに似ているというファーストインプレッションだったが、emacs を設定している設定ファイルをはじめての見て編集したときは、何この詩 ? と思った。
emacs 用に hy 編集に使えそうなのは、ほかにも lispy というのがあるようだ。
しばらく emacs で、おたおたやってみてたが、jupyter notebook だとセルごとに実行して魚拓のように結果をアーカイブしておけるので、チュートリアルを一通り魚拓とってみたりした方が後でも見直せると思う。
こういった感じに。
Jupyter notebook hy カーネル Calysto
~/.emacs.d/init.el
vim ~/.emacs.d/init.el
;;minimum setting for fake litle lispers.
;; Set up package.el to work with MELPA
(require 'package)
(add-to-list 'package-archives
'("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
;;; Hy-mode
(setq inferior-lisp-program "hy")
(autoload 'hy-mode "hy-mode"
"Mode for editing Hylang source files"
t)
(setq auto-mode-alist (append '(("\\.hy$" . hy-mode)) auto-mode-alist))
(add-hook 'hy-mode-hook
(lambda ()
(setq hy-font-lock-keywords
(append '(("(\\|)" . paren-face))
hy-font-lock-keywords))))
;;Evil (vim) mode
;(add-to-list 'load-path "~/.emacs.d/evil")
;(require 'evil)
;(evil-mode 1)
Rf.日本語ベーシック
.emacs
vim ~/.emacs
(load (expand-file-name "~/.emacs.d/init"))
(Meta key)-(x) pa-li-pa
(Meta)-(x) pa-install RET hy-mode
apt update
! 重要
google アプリの termux は死んでいる。F-droid からインストールできるならば、そうしたほうがいい
python3 -m pip install --upgrade pip
emacs エディターの evil mode ( vim editor キーバインド) で hy-mode (common Lisp 文法でpython 3の仮想機械に実行させる hy 言語の編集モード) というとややこしいが、シンプルに動くので、素直な心でゼロからemacs に帰依してみるのもいい。
Evil
Why Hy?
Why Hy? よりまえに、なんでイカ (Cuttlefish) なのかは wikipedia にも載っていない。
なぜイカ ??
いいけど。やり始めて2日連続、イカの丸焼きを食べた。
イカは不思議な姿をしている。
Learn X in Y minutes, where X=hy
chromebook
chromebook Acer tab 10 Chromebook の場合はコンテナの Linux なので、Termux の独自パッケージでは存在していない Arm 64 向けの Lisp / Scheme のプログラムも存在する。少なくとも SBCL(Common Lisp) と Gauche(Scheme) は公式なインストール方法でインストールできた。
apt search sbcl
https get request
curl https://beta.quicklisp.org/quicklisp.lisp -o quicklisp.lisp
sbcl --load quicklisp.lisp
Rf.https://www.math.s.chiba-u.ac.jp/~matsu/cl/index.html
* (ql:add-to-init-file)
* (load "~/quicklisp/setup.lisp")
* (ql:quickload :drakma)
T
* To load "drakma":
Load 1 ASDF system:
drakma
; Loading "drakma"
(:DRAKMA)
* (drakma:http-request "https://example.com")
Rf.https://edicl.github.io/drakma/
Dexador
common lisp のパッケージの名前はデスメタルっぽくていい。
Gauche
export PATH="$PAT:/HOME/chatnoir/gauche/bin"
Rf.Gauche install
http://practical-scheme.net/gauche/download-j.html
ERROR: TLS handshake failed: -40
簡単な https のリクエストに詰まった (4時間) ので、一歩も動けなかった。
google ==> "gauche" "https" get ssl
言語で一番難しいのは、セットアップだろう。
他人の家にある誰かの鞄のなかかから、目的のものをとってくるようなもので、それを上手にとってこさせる説明がきれいにできる人は、そうはいない。鞄の持ち主は、よくわかっているから自分で解っていることを説明できるが、解っているだけに知らない人のわからないことが明確に見えないので、一度やってわからない人がわかるようにならないと道しるべができない。
なので、たすけて。
というところでようやく外にでかける。
これは、インストールからやり直しってことかな。
トライした https はすべてダメだったので、インストールのスクリプトを最初に編集しておく必要があるようだ。
だから、用意されたインストールスクリプトではオプショナルの ssl のためのものが入ってないな。
つまり、公式の簡単インストール用の bash でインストールした場合だと https リクエストのプログラム書いても、通らないサーバーが(自分の場合は全てだった)あるので、http -get の文法を調べ回っても、そういう問題以前なので、なかなか原因がわからなかった・・・ということになるんだろうか。https なかなか超えられないものですな。ブラウザだと当然すぎて意識すること無いのだけども、色々こみいってあれこれしないと ssl できないというのも、他の言語と環境でみたのでわかりますが、デフォルトでクリアできない場合、それ以降の不具合のレベルが想定できないのでタッチすると途方もなく時間がかかる。
<Mbed TLS> を Gauche とは別にインストールしてから、その後に Gauche をインストールする必要があるようだけど ・・・・
Gauche インストールスクリプトのダウンロード。これを編集する必要もあるのかな。
curl https://raw.githubusercontent.com/shirok/get-gauche/master/get-gauche.sh -o get-gauche.sh
・・・これでいけるとも限らないので、Gauche については、またいつかどこかで。すごく名前がいいとおもう。
2021.12.25 時点で加筆:Termux で gauche がパッケージになった。arm cpu 64bit OS では、 Mbed TLS 付きでインストールされる。arm cpu 32 bit OS ではエラーになるので使えない。
最初から unicode 対応の scheme ぽいもの(というか以上に盛っている algol とか)ということで Racket にも入門してみた。
おかげで、ぜんぜん進まない。ライブラリはある、https にまったく問題なし。が、また独特の関数と解説ドキュメントなので、実際に動くサンプルの一連を探す。
hy を使って python のライブラリや組み込み関数を Lisp シンタックスで当てはめて、正解不正解によって推量していくと、何となく「ワカッタ。」という瞬間が明確にきて、それが間違っていたとあとから気がつく瞬間にもはっきりとパズルを解くようなレベルアップ感があって、苦し楽しい。
そしてそのあとに、今度は予想のつかないネーミングの Common Lisp のモジュールや関数や構文を調べて、書いていくのは、もう完全に自然言語の習得のようなゲーム性がある。
完全にいけないことをやりつづけている危険性を感じつつ、楽しい。
これは、あぶない。
Lisp 参考資料
0:プログラミング言語Scheme
富山大学理学部数学科
木村 巌
最終更新日:2003年8月26日
1:Cyanを設計した高校生、5カ月で5つの言語を
(2/3 ページ)
2:広井誠 (Makoto Hiroi)
xyzzy Lisp Programming
3:抽象構文木
Rubyで電卓を作る 文:遠藤侑介 イラスト:hirekoke
4:マッタク 初めての人のためのILLisp
5:ANSI X3J13 Common Lispに関わる歴史資料
6:Amazon.co.jp での Lisp 関連書についてのいろんな人のレヴュー全て
マンガとコンピューター言語のカテゴリではamazonのレヴューはフェイクが少ない。他は全部フェイクだと考えると間違いは起こらない。
7: (資料を読み解くための人名、歴史、案内)
プログラミング言語 Scheme の解説
齊藤のサイト
8:Appendix 4. Scheme 関連の文献
紫藤のページ
紫藤貴文
9:「Scheme手習い」という本
kb84tkhrのブログ 2015 11 24
10:ふつうの Lisp 入門
11:julia --lisp is just a little easter egg
12:tiny版femtolispで遊んでみた
13:LispSyntax.jl is implemented as an expression translator between lisp/clojure-like syntax and julia's AST.
14:
15:The Common Lisp Cookbook
16:Practical Common Lisp
17.Lumo is a standalone ClojureScript environment that runs on Node.js and the V8 JavaScript engine.
18.janet lang
19.chiken