2011-03-04 11 views
2

この質問は純粋に知的好奇心から出てきます。 Pythonのセクションを比較的頻繁に閲覧した結果、thisに似た疑問がいくつか出てきました。そこでは、誰かがプログラム変数を使ってグローバル変数を定義するよう求めています。彼らのうちのいくつかはexecの落とし穴を認識していますが、他のものはそうではありません。変数名をプログラムで作成できる言語の種類は?

しかし、私は最近、以下が一般的であるのStata、でプログラミングをしてきた:

Stataの用語で
local N = 100 
local i = 1 
foreach x of varlist x1 - x`N' { 
    local `x' = `i' * `i' 
    ++i 
} 

、名前Nとローカルマクロが作成され、 `` N」evaluates to 100. In each iteration of the foreachのloop, a value from x1 tox100 is assigned to the local macrox. Then, the line inside the loop, assigns the square ofi to the expansion ofx, a local macro with the same ending asi . That is, after this loopx4 expands to 4^2 andx88`は88^2に拡張されます。

Pythonで似た何かをする方法は、次のようになります。そして、

squares = {} 
for x in range(1,101): 
    squares[x] = x**2 

squares[7]は^ 2 7に等しいです。

これは非常に簡単な例です。 stataマクロには他にも多くの用途があります。あなたは、例えば、評価されるべき機能を渡す方法としてそれらを使用することができます。

local r1 "regress" 
local r2 "corr" 

foreach r of varlist r1-r2 { 
    ``r'' y x 
} 

rを二重目盛りは、実行中の結果と、regress/corrに最初r1/r2に、その倍のマクロを展開します独立変数としてyを従属変数とし、とxとの間の相関を示す線形回帰。もっと複雑なものも可能です。

私の質問は基本的には、変数割り当て/評価がこのような "マクロ割り当て/拡張"を行う言語のいくつかのより大きなカテゴリに分類されますか?なぜこのように言語が設計されるのか、そして/または他の言語で類似した構造の例についての説明のためのボーナスポイント。

答えて

3

これは構文上の砂糖がどれくらいあるかという問題です。塩の価値がある言語であれば、地図や辞書のデータ構造を使って実行時にある値で変数名(キー)を作成することができます。一部の言語では、他の言語よりも通常の変数識別子との透過的な統合が可能です。

1

JavascriptはStataではなくPythonのようなものですが、明らかな例です。

for(var i = 0; i < 100; i++) 
    this["var" + i] = i * i; 

alert(var8); // 64 
2

これはあなたが探しているものであれば、私は知りませんが、PHPにあなたが行うことができます:

for ($i=0; $i<10; $i++) { 
    ${x.$i} = $i*$i; 
} 

print $x3; // prints 9 
print $x4; // prints 16 

私は個人的に、これは非常に不愉快見つけます。

2

(申し訳ありませんが、これは「答えは、」ないコメント....人々が私の答えを評価していないので、私は質問にコメントするのに十分なポイントを持っていないです。)

まず、聞かせて私はStataについて奇妙なことを指摘しているのは、そのコード行を実行する前にマクロを翻訳するということです。例:

あなたが入力したとします。

local x3 = 20 
local y = 3 
display "I am `x`y'' years old" 

内部的には、Stataのはdisplayコマンドを実行し(外側に内側の)地元の人やを翻訳しようとしています。 Stataのコマンドにその後、

display "I am `x3' years old" 

その後、

display "I am 20 years old" 

を翻訳する、ある 、Stataのは、実際にコードのこの最後の行を実行します。まず、次のコマンドを実行して、すべてを見ることができます:set trace on

微妙な違いがあります。 ` 'ブラケットは、コマンドを変更します。私はこれが実際に他のプログラミング言語とは異なると思う。他の言語では2行のコード(1つはマクロを展開する、もう1つはコード行を実行する)が必要な1行のコードでStataで何かを行うことができます。

これは何についての有用なのは、

display "I am `= 2011 - 1991' years old" 
display "I am `= floor(uniform()*`x`y'')' years old" 

(彼らは数値または文字列...例えば、行列を返す何を返す限り)のStataも` 'カッコ内の式のすべての種類を評価することができるということです一度使い慣れたら、これは非常に便利です。マクロはStataのものをの方法でよりもきれいにします(SASなど)。 SASの%letのステートメントは、それほど柔軟性がありません。

私はまた、いくつかのミスを指摘するつもりでした。

(1)ループはこれらの実施例に間違った設定されています。 x1, x2, ... , x100は変数ではなく、マクロ(ローカル)です。 x1-x100は変数リストではないため、foreach x of varlist x1 - x100と言うことはできません。もし私がそれをやろうとしていたら、私はおそらく次のように使います:

local N = 100 
forvalues i = 1/`N' { 
    local x`i' = `i' * `i' 
} 

2番目の例でも同じ誤りがあります。 r1r2は変数ではありません。 (私は実際にはおそらく実行するためのより高速な髪で同等、foreach r of local mycommands { ... }を入力しますが)

local mycommands regress corr 
foreach r in `mycommands' { 
    `r' y x 
} 

: あなたはこれを行うことができます。

(2)第二に、++iは有効ではありません。あなたはたぶんlocal ++iと言っていました。

関連する問題