LoginSignup
1
1

More than 1 year has passed since last update.

emacs hy-mode

Last updated at Posted at 2021-10-19

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

Screenshot_20211029-002544_kindlephoto-244948224.png

ラムダ


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

Screenshot 2021-10-22 12.32.07.png

他の 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 翻訳中に一回なんかしてくれる)。

Screenshot_20211101-205516_kindlephoto-35522460.png

Screenshot_20211101-205007_kindlephoto-35211915.png

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

Screenshot_20211022-145341_kindlephoto-12047076.png

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 as progn), 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
IMG_20211019_185035_983.jpg

apt update

! 重要

google アプリの termux は死んでいる。F-droid からインストールできるならば、そうしたほうがいい

Rf.
https://qiita.com/dauuricus/items/304760b87a1a616c7a6d

python3 -m pip install --upgrade pip
IMG_20211019_175521_209.jpg

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

Screenshot 2021-10-20 13.04.51.png

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

Screenshot 2021-10-20 12.01.36.png
Screenshot 2021-10-20 13.20.27.png
Screenshot 2021-10-20 13.23.28.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

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

Screenshot 2021-10-20 17.57.58.png

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1