The Yak Shaver
さあ、今日も毛を刈ろう。
skip to main
|
skip to sidebar
2013/04/19
Elisp のトグル動作や内部カウンタはクロージャを使う
よく忘れるので、メモしておきます。 トグル動作をさせたい場合や、内部のカウンタを使いたいときは、スタティック変数が欲しいところです。 Emacs Lisp ではクロージャを使えば可能です。 (defun cage1 () (lexical-let ((v 0)) (defun func1 () (setq v (1+ v))))) ; C-x C-e これを評価すると、`cage1` という関数が定義されます。しかし `cage1` 関数自体はコールされてないため、`cage1` の中にある `func1` 関数はまだ未定義です。 なので、`func1`をコールしたいと思っても、 (func1) ; C-x C-e Debugger entered--Lisp error: (void-function func1) (func1) eval((func1) nil) eval-last-sexp-1(nil) eval-last-sexp(nil) call-interactively(eval-last-sexp) eval-region-or-last-sexp() call-interactively(eval-region-or-last-sexp nil nil) となり、エラーが発生します。 一旦 `cage1` をコールしてやれば、 `func1` が定義されるので、それ以後は問題なく `func1` をコールできるようになります。 (cage1) ; C-x C-e (func1) ; C-x C-e => 1 (func1) ; C-x C-e => 2 (func1) ; C-x C-e => 3 ここでもし 変数 `v` がグローバル変数なら、外から値を変更できてしまいます。しかし、この `v` はレキシカル変数(この場合 `cage1` 内部にある、一種のローカル変数)なので、外から変更できません。 外から変更しようとして、下のようにしても (setq v 100) ; C-x C-e (func1) ; C-x C-e => 4 (func1) ; C-x C-e => 5 というぐあいに、`func1` が 101, 102, ... を返したりはせず、カウンタの動作として正しい値をカウントし続けます。 つまり、100 を setq した `v` と `func1` がカウンタに使っている `v` は別物ということです。 カウンタではなく、トグル動作にしたい場合は (defun cage1 () (lexical-let ((v nil)) (defun func1 () (setq v (not v))))) とします。
0 コメント :
コメントを投稿
次の投稿
前の投稿
ホーム
About
Unknown
詳細プロフィールを表示
Labels
AVR
( 12 )
Blogger
( 10 )
Chrome
( 2 )
cocoa
( 5 )
Eagle
( 5 )
emacs
( 31 )
game
( 1 )
Google
( 4 )
iPhone
( 2 )
Javascript
( 1 )
lisp
( 4 )
LPCXpresso
( 1 )
mac
( 53 )
Markdown
( 4 )
msp430
( 1 )
NXP
( 1 )
Parallels Desktop
( 1 )
PIC
( 3 )
python
( 19 )
Raspberry Pi
( 9 )
ruby
( 1 )
Safari
( 2 )
shell script
( 4 )
Sublime Text
( 1 )
windows
( 7 )
xcode
( 8 )
xyzzy
( 60 )
おぼえがき
( 69 )
まとめ
( 6 )
メール
( 2 )
よもやま
( 19 )
工作
( 23 )
電験
( 4 )
本日の探索結果
( 2 )
Blog Archive
►
2015
( 3 )
►
02
( 1 )
►
01
( 2 )
►
2014
( 17 )
►
12
( 1 )
►
07
( 3 )
►
06
( 3 )
►
04
( 2 )
►
03
( 4 )
►
01
( 4 )
▼
2013
( 135 )
►
12
( 5 )
►
10
( 6 )
►
09
( 7 )
►
08
( 10 )
►
07
( 24 )
►
06
( 15 )
►
05
( 15 )
▼
04
( 17 )
CSS の margin パラメータ数の違い
Pyhton で JPEG画像を添付してメールを送信
Elisp のトグル動作や内部カウンタはクロージャを使う
Google の Custom Search Engine で画像を検索するサンプル
BloggerにGistを貼り付けると、前後に空行が入ってしまう
Pyhton で GMail の smtp で UTF-8 なメールを送信
MYO:腕の筋肉の動きを検知するコントローラ
Google の検索結果に表示される 著者の写真を非表示に
Mac の Safari で Backspace (DEL) キーで前のページに戻るようにする
Spotlight を grep find の代わりに
ack を MacPorts で入れてみる
C-u つきの query-replace は正規表現で
Python でもスクラッチバッファで対話したい
コード片を Markdown 向けに
Mac のターミナルでスクロールバッファをクリアする
モードラインにファイルのフルパスを表示
Finder に 「上へ」ボタンを
►
03
( 13 )
►
02
( 17 )
►
01
( 6 )
►
2012
( 11 )
►
10
( 5 )
►
07
( 1 )
►
02
( 2 )
►
01
( 3 )
►
2011
( 86 )
►
12
( 2 )
►
11
( 2 )
►
10
( 1 )
►
07
( 2 )
►
06
( 3 )
►
05
( 20 )
►
04
( 49 )
►
03
( 7 )
►
2009
( 4 )
►
03
( 1 )
►
01
( 3 )
►
2008
( 8 )
►
12
( 8 )
STAT
Ads
Amazon.co.jp ウィジェット
Powered by
Blogger
.
0 コメント :
コメントを投稿