主にプログラミングに関して。Python, .NET Framework(C#), JavaScript, その他いくらか。
記事にあるサンプルやコードは要検証。使用に際しては責任を負いかねます

スポンサーサイト

                
tags:
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Boo: 関数の宣言方法やクロージャについて その2

                
前回: Boo: 関数の宣言方法やクロージャについて

前回はBooでの無銘関数を使ったクロージャの作成をしてみて、Pythonでの場合と違っていてこれは便利だという記事を書いた。でもちょっと考えてみるとそうでもない部分もある。Booでの無銘関数を使ったクロージャで、ちょっと頭に入れておかないといけない部分までまとめてみる。


Booではブレース"{}"を使うことによって、インデントによる制御構造から抜け出すことができる。下部につけたスクリプトのうちで、BraceFunc1とBraceFunc2がそれを利用して関数を定義している。ブレース内では式の前にいくら字下げを入れようが関係なくなる。セミコロンによって区切られた式が粛々と実行されていく。これを利用すると、JavaScriptのように無銘関数でクロージャをつくることができる。下部にあるスクリプトのClsr1, Clsr2が無銘関数で作ったクロージャだ。関数の定義と同時に実行までしていて、内部で定義した関数を変数に返している。ちょっと便利。でも万能ではない。

インデントによる制御構造から抜け出した副作用として、ブレース内では制御構造が必要な構文は書けなくなる。for, while, if, defなどのことである。Clsr2のようにリスト内包を書くことはできるが。
ではクロージャの中で制御文を書きたい場合はどうするか。スクリプトのClsr3でそれをやっている。ブレースの使用をやめてdefを使う。defでの無銘関数定義を一度変数に入れ、変数を渡してやることでクロージャになる。

namespace ClosureExcercize

import System

BraceFunc1 = {x as string| x += ", "; x += "with love\n"; print x;}
BraceFunc1("From Russia")

BraceFunc2 = {x as string|
x += ", ";
x += "with love\n";
print x;}
BraceFunc2("From Paris")


Clsr1 = {x as string| x += ',';
return {y = x + ' with love\n'; print y};
}('From Japan')
Clsr1()


for p1 in range(10):
Clsr2 = {x as int|
return {li = [p2 for p2 in range(10) if p2 >= x]; print x + " or more:"; print li};
}(p1)
Clsr2()
print ""

hoge = def(x as string):
return def():
for p in range(20):
x += "!"
print x
Clsr3 = hoge("Boo")
Clsr3()



print "Press any key to continue . . . "
Console.ReadKey(true)

            

コメントの投稿

非公開コメント

プロフィール

hMatoba

Author:hMatoba
Github

最新記事
リンク
作ったものなど
月別アーカイブ
カテゴリ
タグリスト

検索フォーム
Amazon
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。