21/09/04 18:08:18.70 jSSzYM7r.net
スペシャル変数は動的束縛なんだから関係あるだろ
静的束縛では外から変数を注入するようなことは難しいし
自由変数をつかったら中断時に値を元に戻すにはunwind-protectのような機構が必要だって話
100:デフォルトの名無しさん
21/09/04 22:48:02.97 uKq8oRZn.net
>>99
いや違う
スペシャル変数のその挙動は、elispが動的束縛だったときと、静的束縛の時で何も変わってない
要するに、単にそういう機能が実装されてるというだけ
101:デフォルトの名無しさん
21/09/07 20:48:08.70 8Gi3qZOZ.net
>>98
> defvarで定義された変数はスペシャル変数といって、letで束縛するとそういう挙動になるというだけだ
> setqで(無理矢理)定義したグローバル変数はそうならない
Elispの話じゃないじゃないか
102:デフォルトの名無しさん
21/09/08 23:03:47.01 Z7F+3Q5J.net
おそらく 98 100 は 97 の
「キーボード割り込みで大域脱出した時も…UI記述言語として極めて良好な性質を持ってる」
という内容を解釈することもなくletで束縛した変数のシャドウイングについてはスペシャルでもレキシカルでも挙動に変化はないと言いたいのだろう
大域脱出やunwind-protectの話をしているのであさっての主張なんだが
何がどう関係ないのか次はコードで例示してくれ
103:デフォルトの名無しさん
21/09/09 23:10:01.54 ByNHohVX.net
>>97
elispはバッファーローカル変数も興味深い
スレッドローカル変数と意味論的にも近く
マルチバッファーセーフ←→マルチスレッドセーフ
という対比ができる
凄くシンプルな設計と実装で上手くこなしてる
standard-outputやnilストリームの使い方も上手い
104:デフォルトの名無しさん
21/09/10 16:13:07.64 y2IogSqT.net
--- test-global-variable.el ---
;;; -*- lexical-binding: t; -*-
(defvar foo "foo")
(defun print-foo ()
(print foo))
(let ((foo "FOO"))
(print-foo))
(print-foo)
(setq bar "bar")
(defun print-bar ()
(print bar))
(let ((bar "BAR"))
(print-bar))
(print-bar)
--------------------------------
続く
105:デフォルトの名無しさん
21/09/10 16:14:14.79 y2IogSqT.net
-*- lexical-binding: t; -*-の有無で静的束縛を有効無効に出来るけど、
↓有りの場合
$ emacs --script test-global-variable.el
"FOO"
"foo"
"bar"
"bar"
↓無しの場合
$ emacs --script test-global-variable.el
"FOO"
"foo"
"BAR"
"bar"
1つ嘘ついたか…動的束縛の場合は、setqで作ったグローバル変数もスペシャル変数になるようだ
しかし、スペシャル変数のletで束縛する挙動は静的動的束縛に関係無く同じ挙動だ
それが言いたかっただけ
106:デフォルトの名無しさん
21/09/10 16:22:31.87 y2IogSqT.net
>>103
バッファローカル変数は、他の言語で言うインスタンス変数と役割は同じだな
例えば、buffer-file-nameはバッファローカル変数で、バッファ毎に違う値になるけど、
本来ならばbuffer.file-nameのように、作成したインスタンス変数内(この例ではbuffer)に有るべきだけど、
Emacsはオブジェクト指向を採用しなかったので、グローバル変数をバッファー毎に違う値にする為に、苦肉の策と言えなくもない
LispでもCLOSのようなオブジェクト指向を全面的に採用していれば、バッファローカル変数の仕組みは必要無いものだった
107:デフォルトの名無しさん
21/09/10 16:29:15.85 y2IogSqT.net
CLOSだと(file-name buffer)で済む所を、elispだと
(with-current-buffer buffer
buffer-file-name)
と書く必要があって、CLOSの方がスマートだと思う
他にもelispのadviceも、CLOSのdefmethodの:before :afterを使えば似たような事ができるだろう(完全に同じじゃないけど)
108:デフォルトの名無しさん
21/09/11 14:40:21.99 WRGMhX/P.net
>>108
それじゃbufferがthisのような特殊な識別子になってるだろ
109:デフォルトの名無しさん
24/01/25 23:01:09.63 GdCzxGB4.net
人工知能言語として脚光を浴びた時代もありました
110:デフォルトの名無しさん
25/02/02 07:50:12.47 DG2EYWWi.net
全部が式だし全部がオブジェクトなので分かりやすいよね。
小さい単位で動的に書き換えていけるので開発体験が良い。
動いてるプログラムのオブジェクトをインスペクタで調べたり中身書き換えたり、デバッガ内で値差し替えてリスタートとか楽しい。
Pythonとかより遥かに動的言語してるイメージある
111:デフォルトの名無しさん
25/06/14 06:59:12.29 3Q/jS2n6.net
norvigやgrahamも言ってたが
PythonはほぼほぼALGOL風味構文のlispだわ
意味論という意味で
まあlispは構文の斉一性こそが大事なので半分だけ同意
112:デフォルトの名無しさん
25/06/15 01:00:42.54 bHsxd1q/.net
Lispってまだあったのか。カァーとかクダァーとかね。
馬鹿馬鹿しいほどのかっこがあったね。今のエディタは
改善されたけど、昔は大変だった。
smalltalkとかprologはどうなったんだろ
113:デフォルトの名無しさん
25/07/04 15:29:07.20 rrB9liNl.net
むしろエディタの進化でカッコの恩恵受けられてるぞ
フォームをドラッグ&ドロップで移動できる
114:デフォルトの名無しさん
25/07/04 15:30:44.25 rrB9liNl.net
なんというかscratch的なアレ
115:デフォルトの名無しさん
25/07/04 21:06:35.47 qls1kG6o.net
lispって、むしろ箱のコピペで記述したら良くね?
116:デフォルトの名無しさん
25/07/06 10:21:58.33 jyZjYPic.net
プレーンテキストが正義
vimとかでSexpr認識して、その操作受け付けるんだから無用でしょ
117:デフォルトの名無しさん
25/07/08 11:32:50.33 Lf/Jcjxk.net
今でも見てる5chの板ってある?
はてな
匿名
ダイアリ
118:デフォルトの名無しさん
25/10/12 02:51:28.83 DKsy7+ZR.net
>>111
>>110
Pythonはlispである、という言説を理解するにはpythonのastを知っているのが前提だろう
pythonは標準のastモジュールで、lisp風前置記法のabstract syntax tree(ast)を出力でき、またそのastを書き換えてコンパイル/実行ができる
すなわち(少なくとも標準c実装の)Pythonには2種類の文法があるということを理解せねばならない
また関数型指向とかイテレータ指向とかの中心教義もlispの(少なくとも当時は)唯一無二な特徴であったから思想的にもね
astは大抵の言語でも構文上lispぽいけど、そこへさらに先に述べた設計思想やらも大体lispインスパイア(GvRも言ってる)なんで、ast構文のPythonはlisp方言と言って差し支えない
algol+c系構文のPythonの記法はastに直されて(あとさらにバイトコンパイル)されるので、シュガーシンタックスなlispともいえるかもね
119:デフォルトの名無しさん
25/10/12 17:32:03.23 r9Vknw05.net
つまりlispのM式がpythonってことだよな