LISPって実際どうなの... [無断転載禁止]©2ch.net (112レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

104: デフォルトの名無しさん [sage] 2021/09/10(金) 16:13:07.64 ID:y2IogSqT(1/4) AAS
--- 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: デフォルトの名無しさん [sage] 2021/09/10(金) 16:14:14.79 ID:y2IogSqT(2/4) AAS
-*- 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: デフォルトの名無しさん [sage] 2021/09/10(金) 16:22:31.87 ID:y2IogSqT(3/4) AAS
>>103
103(1): デフォルトの名無しさん [sage] 2021/09/09(木) 23:10:01.54 ID:ByNHohVX(1) AAS
>>97
elispはバッファーローカル変数も興味深い

スレッドローカル変数と意味論的にも近く
マルチバッファーセーフ←→マルチスレッドセーフ
という対比ができる

凄くシンプルな設計と実装で上手くこなしてる
standard-outputやnilストリームの使い方も上手い
バッファローカル変数は、他の言語で言うインスタンス変数と役割は同じだな
例えば、buffer-file-nameはバッファローカル変数で、バッファ毎に違う値になるけど、
本来ならばbuffer.file-nameのように、作成したインスタンス変数内(この例ではbuffer)に有るべきだけど、
Emacsはオブジェクト指向を採用しなかったので、グローバル変数をバッファー毎に違う値にする為に、苦肉の策と言えなくもない
LispでもCLOSのようなオブジェクト指向を全面的に採用していれば、バッファローカル変数の仕組みは必要無いものだった
107
(1): デフォルトの名無しさん [sage] 2021/09/10(金) 16:29:15.85 ID:y2IogSqT(4/4) AAS
CLOSだと(file-name buffer)で済む所を、elispだと
(with-current-buffer buffer
buffer-file-name)
と書く必要があって、CLOSの方がスマートだと思う
他にもelispのadviceも、CLOSのdefmethodの:before :afterを使えば似たような事ができるだろう(完全に同じじゃないけど)
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.758s*