emacs hy-mode

Lisp の人の言質はだいたい典型的な特徴があり、自賛と懐古的な礼讚が７割入るので、9 割引で信用するとして、残りがよくわからないので、自分もそっちに λ ってみるしかない。

![Screenshot_20211029-002544_kindlephoto-244948224.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/7508b656-5068-d70e-8315-7e233bb2ff8e.png)

ラムダ

https://ja.m.wikipedia.org/wiki/%E3%83%A9%E3%83%A0%E3%83%80%E8%A8%88%E7%AE%97

---

Android で 64bit アーキテクチャの Arm CPU で common Lisp ぽいことをやろうとすると今のところ唯一 hy だけ方法がわかる。現時点でまったくよく知らないが、hy は clojure に影響を受けているので、その両者は、よくにているはず。clojure の古い本をパラパラ見てみると、python よく知ってても全然わからんかもよというように書いているので、python から clojure へ向かうのに hy へトラバースしてから登っていくのは近道かもしれない。プログラミングってよくわからないので、一つ二つの用途の単純なプログラムを 4 ヶ月くらいの間に 6 つの言語にスライドして翻訳しては書き直していると、だいたい同じで、なんか大幅に違う Lisp に関心をもったという動機なので、Lisp ぽい語順にまずは慣れたい。

Common Lisp アプリでは **CL REPL (ecl)**が動くが（これイイ!）。

https://www.lights-of-holiness.eu/cl-repl/blog.htm

termux では 32bit だと ecl が動くらしいが、64bit cpu ではエラーになった。他にも debian や ubuntu をセットして、そこへビルドする等、実践しているという情報はあるが、Lisp 側に変更点がなくともホスト側が日々変更があり今日どのようにするのか調べて実践するのには数日間かかる（数十日でも、わからないまま）。
[非公式のパッケージで Racket はある](https://github.com/termux/termux-packages/issues/42)が、Arm cpu 64bit (OS 32bit モード）の Fire HD 10 ではエラー ;`cannot locate symbol "ffi_type_uint32"`（たぶん他のデバイスでは動くのでは？と期待しているけど調べられぬ）。たんに無いというのはセットアップ bash の path が違うだけなのだろうか（これはクロスコンパイルして、そのレシピを作った人の認識している環境の範囲外で起こることだと思う）。不明。

2021.12.24 時点では racket は termux の公式パッケージに存在する。そして同上 Fire OS でもエラーにならなかった。

https://github.com/termux/termux-packages/pull/7625

`tinyscheme`という scheme はエラーにならなかった。

https://qiita.com/dauuricus/private/caad0d5ed1d0e4e4fdb1

# hy lang

https://docs.hylang.org/en/master/

hy ではなくまた別の python にアダプテッドしている scheme のドキュメントに説明が書いてある。
https://hissp.readthedocs.io/en/v0.2.0/faq.html

![Screenshot 2021-10-22 12.32.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/d69d1887-5f9f-4fc1-744b-a1d74f806af8.png)

https://github.com/gilch/hissp

https://gitter.im/hissp-lang/community?at=5d77ca3a3b1e5e5df188228c

他の Lisp だと計算機科学のカリキュラムと理想というレールの本の足し算から始まって、インタプリターの実装という定番らしい世界観の道筋があり、ある程度そのコースに委ねて 1987 年くらいまでレイドバックして進まないと見えてこないが、hy の場合は python のコード内容をほぼそのまま Lisp 風の語順の文法にする練習から始められるので、自分の解っていることと対比して現在現時点の世界とパラレルで手探りで進められる。（数十日委ねた. [初めての人のためのLISP](https://ja.m.wikipedia.org/wiki/%E7%AB%B9%E5%86%85%E9%83%81%E9%9B%84)を図書館で見つけて、開いて、５分で閉じた. そこでモチベーションのかなりを失った. ）

現在現時点 .... たとえば、最低限　[https で get リクエストする](https://qiita.com/dauuricus/items/a7c756569a3d7bcf46f2)ところからのスタートで、それ以上の機能至上主義話からでもなく、足し算の仕方でもないところ。今現在、あたりまえにできることをどうやるのか、というところから。

という emcs の hy モードのコマンド。

```emacs-lisp
(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 の動きを同時にモニターしつつファイルを更新していくのと変わらないと言えば、そうかもしれない。

https://masatoi.github.io/2017/05/11/hy-tutorial

https://kitchingroup.cheme.cmu.edu/blog/2016/03/31/More-on-Hy-and-why-I-think-it-is-a-big-deal/

https://en.m.wikipedia.org/wiki/Tmux

emacs を REPL として使っている。`(Control key) c, (Control key) b` のコマンドで hy のバッファーが RELP に渡されるようだ。コマンドを実行すると、新たなバッファーに python プログラムコードに変換されたものが現れて、実行される。python は読めて、Lisp は知らないという人にとって、変換された python コードの時点で思っているのと違っていたら Lisp（hy）文法上の間違いというデバックができる（逆の場合必要ないかもしれない）。マクロというのもこのコマンドで実行された（当然なのかもしれないけれども、わたしは現時点でマクロが何してくれるナニをまったく知らない。マクロ式を評価するとコンパイル中というか python 翻訳中に一回なんかしてくれる）。

![Screenshot_20211101-205516_kindlephoto-35522460.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/f0cad733-e2db-4207-ed77-8f29f1370e6b.png)

![Screenshot_20211101-205007_kindlephoto-35211915.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/6b40e86a-619b-115f-63c4-f2a90ed28d54.png)

`print("改行なし",end="")`

https://hylang.github.io/hy-interpreter/

![Screenshot_20211022-145341_kindlephoto-12047076.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/117346ef-5121-634e-cdb4-8f4ac78d8179.png)



hy の場合の python の NoneType のチェックにかなり注意が必要。`none?`,`empty?` は hy にかつてはあったけど、今無いのかもしれない（[古いバージョンのドキュメント](https://docs.hylang.org/en/stable/language/core.html)には記載されているが、実際プログラムに書いても定義されていなかった）。`is None` は載っていない。

rf.https://github.com/hylang/hy/releases

```hylang
(if (do (is (re.search r"(?<=\]\s).+?(?=\&)" (get m_title 0)) None))
    (do
```

かな。いや？

```hylang
(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 as `progn`), which combines several forms into one, returning the last:

**progn**

http://www.nct9.ne.jp/m_hiroi/xyzzy_lisp/abclisp04.html

あと、`import` 文の書き方なども、これはどうするんだろう?

Python の場合。
 
```python
import re
import requests
import sqlite3
import os
import sys
from bs4 import BeautifulSoup
```

Hy こうなった。

```hylang
(import re)
(import requests)
(import sqlite3)
(import os)
(import sys)
(import [bs4 [BeautifulSoup]])
```

```hy
;########################################
(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)
```

**ひじょうに難解な、すごい言語を習得しようとしている**というよりも、パズルのように文の語順をルールに則って組み換えるゲームをしていると思うと楽しい。というよりも、難解なことしなければいいと思うだけで、シンプルに見える。

https://qiita.com/dauuricus/items/d8bd9d3301409f51c64e

ロゼッタが python で、python のこともよくは知らないから、形態素に分解してピースの一個一個を調べて填まるかどうかやっている感じ。
まぁ片方の python は完全に動くので、そこに Brood parasite (托卵)されてるカッコ言語を通じるかどうか話している。Ruby にも感じたが、「文章」という感じなので、もし仮に C 言語のような書き方について馴染みがなければ、逆にこっちの方が理解しやすいかもしれない。
Ruby の場合は、古に本のなかだけで見ていた[日本語ベーシック](https://en.m.wikipedia.org/wiki/Tomy_Tutor)に似ているというファーストインプレッションだったが、emacs を設定している設定ファイルをはじめての見て編集したときは、何この詩 ? と思った。

emacs 用に hy 編集に使えそうなのは、ほかにも lispy というのがあるようだ。

https://github.com/abo-abo/lispy#configuration-instructions

しばらく emacs で、おたおたやってみてたが、jupyter notebook だとセルごとに実行して魚拓のように結果をアーカイブしておけるので、チュートリアルを一通り魚拓とってみたりした方が後でも見直せると思う。
こういった感じに。

https://nbviewer.org/github/bollwyvl/hy_kernel/blob/master/notebooks/Tutorial.ipynb

Jupyter notebook hy　カーネル Calysto

https://pypi.org/project/calysto-hy/



#~/.emacs.d/init.el

vim ~/.emacs.d/init.el

```emacs-lisp
;;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.日本語ベーシック

http://nrtdrv.sakura.ne.jp/gbasic/

#.emacs

vim ~/.emacs

```emacs-lisp
(load (expand-file-name "~/.emacs.d/init"))
```

#(Meta key)-(x) pa-li-pa
(Meta)-(x) pa-install RET hy-mode
![IMG_20211019_185035_983.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/b64d1daf-78e5-d056-6dcc-dcd49940cfd3.jpeg)


# apt update

! 重要
>**google アプリの termux は死んでいる。F-droid からインストールできるならば、そうしたほうがいい**
>>Rf.
https://qiita.com/dauuricus/items/304760b87a1a616c7a6d

python3 -m pip install --upgrade pip
![IMG_20211019_175521_209.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/8eb9f024-9281-4fca-59e7-6cfa9be7c72f.jpeg)

emacs エディターの evil mode ( vim editor キーバインド) で hy-mode (common Lisp 文法でpython 3の仮想機械に実行させる hy 言語の編集モード)　というとややこしいが、シンプルに動くので、素直な心でゼロからemacs に帰依してみるのもいい。

**Evil**

https://qiita.com/dauuricus/items/fcd30edb55127c5a5986


# Why Hy?

https://en.m.wikipedia.org/wiki/Kraken#/media/File%3A20000_squid_holding_sailor.jpg

Why Hy? よりまえに、なんでイカ　(Cuttlefish) なのかは wikipedia にも載っていない。

なぜイカ ??

https://en.m.wikipedia.org/wiki/File:Hy_Cuddles.png

https://github.com/hylang/hy

いいけど。やり始めて２日連続、イカの丸焼きを食べた。
イカは不思議な姿をしている。

**Learn X in Y minutes, where X=hy**
 
https://learnxinyminutes.com/docs/hy/

----

# chromebook

[**chromebook**](https://qiita.com/dauuricus/items/304760b87a1a616c7a6d) Acer tab 10 Chromebook の場合はコンテナの Linux なので、Termux の独自パッケージでは存在していない Arm 64 向けの Lisp / Scheme のプログラムも存在する。少なくとも　SBCL(Common Lisp)　~~と Gauche(Scheme) は公式なインストール方法で~~インストールできた。

apt search sbcl

![Screenshot 2021-10-20 13.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/89cd6cea-cdef-110a-7bef-b493f70209d9.png)

https get request

```terminal
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

```lisp
* (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/

https://lispcookbook.github.io/cl-cookbook/web-scraping.html

Dexador

https://lisp-journey.gitlab.io/blog/common-lisp-async-web-scraping/

common lisp のパッケージの名前はデスメタルっぽくていい。

----

**Gauche**

![Screenshot 2021-10-20 12.01.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/9cfa88fd-1cd7-c00c-e5b0-2cb6b6f9d017.png)
![Screenshot 2021-10-20 13.20.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/552482b1-05c9-0862-9c85-b945075e1790.png)
![Screenshot 2021-10-20 13.23.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ee19e5ad-39a8-51a4-f9dd-878c20119431.png)

`export PATH="$PAT:/HOME/chatnoir/gauche/bin"`

Rf.Gauche install
http://practical-scheme.net/gauche/download-j.html
![Screenshot 2021-10-20 14.37.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/59f069e7-5497-9783-b7d1-5667de8ec753.png)


**ERROR: TLS handshake failed: -40**
簡単な **https のリクエスト**に詰まった　(4時間)　ので、一歩も動けなかった。

![Screenshot 2021-10-20 17.57.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/54f61d71-4e83-8439-186a-a51ce3ac27b0.png)

# google ==> `"gauche" "https" get ssl`

http://practical-scheme.net/wiliki/wiliki.cgi?Gauche%3ABugs%3Alog19#H-rbkzrg

https://github.com/shirok/Gauche/issues/723

言語で一番難しいのは、セットアップだろう。

他人の家にある誰かの鞄のなかかから、目的のものをとってくるようなもので、それを上手にとってこさせる説明がきれいにできる人は、そうはいない。鞄の持ち主は、よくわかっているから自分で解っていることを説明できるが、解っているだけに知らない人のわからないことが明確に見えないので、一度やってわからない人がわかるようにならないと道しるべができない。

なので、たすけて。

というところでようやく外にでかける。

これは、インストールからやり直しってことかな。
トライした https はすべてダメだったので、インストールのスクリプトを最初に編集しておく必要があるようだ。
だから、用意されたインストールスクリプトではオプショナルの ssl のためのものが入ってないな。

https://github.com/shirok/Gauche/blob/master/INSTALL.adoc#tlsssl-support

つまり、公式の簡単インストール用の 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
```

https://github.com/ARMmbed/mbedtls

・・・これでいけるとも限らないので、Gauche については、またいつかどこかで。すごく名前がいいとおもう。

2021.12.25 時点で加筆:Termux で gauche がパッケージになった。arm cpu 64bit OS では、 Mbed TLS 付きでインストールされる。arm cpu 32 bit OS ではエラーになるので使えない。

https://github.com/termux/termux-packages/issues/8329

----

最初から unicode 対応の scheme ぽいもの（というか以上に盛っている algol とか）ということで Racket にも入門してみた。

おかげで、ぜんぜん進まない。ライブラリはある、https にまったく問題なし。が、また独特の関数と解説ドキュメントなので、実際に動くサンプルの一連を探す。

https://stackoverflow.com/questions/9848899/how-to-get-html-response-from-a-url-string-scheme-racket/9849246#9849246

https://m.youtube.com/watch?v=KTWq1XAfuMQ

----

hy を使って python のライブラリや組み込み関数を Lisp シンタックスで当てはめて、正解不正解によって推量していくと、何となく「ワカッタ。」という瞬間が明確にきて、それが間違っていたとあとから気がつく瞬間にもはっきりとパズルを解くようなレベルアップ感があって、苦し楽しい。
そしてそのあとに、今度は予想のつかないネーミングの Common Lisp のモジュールや関数や構文を調べて、書いていくのは、もう完全に自然言語の習得のようなゲーム性がある。
完全にいけないことをやりつづけている危険性を感じつつ、楽しい。
これは、あぶない。

----

##### Lisp 参考資料

0:プログラミング言語Scheme
富山大学理学部数学科
木村 巌
最終更新日：2003年8月26日

http://www.sci.u-toyama.ac.jp/~iwao/Scheme/scheme.html

1:Cyanを設計した高校生、5カ月で5つの言語を
（2/3 ページ）

https://atmarkit.itmedia.co.jp/ait/articles/0901/15/news131_2.html

2:広井誠 (Makoto Hiroi)
xyzzy Lisp Programming

http://www.nct9.ne.jp/m_hiroi/xyzzy_lisp/abclisp01.html#chap01

3:抽象構文木
Rubyで電卓を作る　文：遠藤侑介　イラスト：hirekoke

https://ascii.jp/elem/000/001/255/1255878/

4:マッタク 初めての人のためのILLisp

https://www.amazon.co.jp/%E3%81%BE%E3%81%A3%E3%81%9F%E3%81%8F%E5%88%9D%E3%82%81%E3%81%A6%E3%81%AE%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AEISLisp-%E7%AC%B9%E5%B7%9D%E8%B3%A2%E4%B8%80-ebook/dp/B074HWYR5N

https://m.youtube.com/watch?v=HbGKbQWUpGg&t=38s

5:ANSI X3J13 Common Lispに関わる歴史資料

https://prof-ida.com/historic.php#h_x3j13

6:Amazon.co.jp での　Lisp 関連書についてのいろんな人のレヴュー全て

マンガとコンピューター言語のカテゴリではamazonのレヴューはフェイクが少ない。他は全部フェイクだと考えると間違いは起こらない。

https://qiita.com/dauuricus/items/7087720bfda27da1c0dc

7: （資料を読み解くための人名、歴史、案内）
プログラミング言語 Scheme の解説
齊藤のサイト

http://www7b.biglobe.ne.jp/~saia/scheme.html

8:Appendix 4. Scheme 関連の文献
紫藤のページ
紫藤貴文

https://www.shido.info/lisp/scheme_resources.html

9:「Scheme手習い」という本
kb84tkhrのブログ 2015 11 24

https://kb84tkhr.hatenablog.com/entry/2015/11/24/212834

10:ふつうの Lisp 入門 

https://m.youtube.com/watch?v=z8NWvztj-GQ&t=35s

11:julia --lisp is just a little easter egg

https://discourse.julialang.org/t/about-julia-and-lisp/25119

12:tiny版femtolispで遊んでみた

https://qiita.com/ytaki0801/items/8b6f9b5f8078b85e219f

13:LispSyntax.jl is implemented as an expression translator between lisp/clojure-like syntax and julia's AST.

https://github.com/swadey/LispSyntax.jl

14:

https://qiita.com/dauuricus/items/1235f7188f2fc5c2f771

15:The Common Lisp Cookbook

https://lispcookbook.github.io/cl-cookbook/iteration.html

16:Practical Common Lisp

https://gigamonkeys.com/book/functions.html

17.Lumo is a standalone ClojureScript environment that runs on Node.js and the V8 JavaScript engine. 

https://github.com/anmonteiro/lumo

18.janet lang

https://bakpakin.com/writing/how-janets-peg-works.html

19.chiken

https://wiki.call-cc.org/portability