2011-03-04 2 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 to x100 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로 확장됩니다. 파이썬에서

것 비슷한 할 수있는 방법 :

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

그런 다음 squares[7] 7^2에 해당합니다.

이것은 매우 간단한 예입니다. stata 매크로에는 다른 많은 용도가 있습니다. 실행의 결과로, regress/corr에 다음 r1/r2 먼저, r 주변의 더블 표시 점은 두 배 매크로를 확장

local r1 "regress" 
local r2 "corr" 

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

: 당신은 예를 들어, 평가하는 기능을 전달하는 방법으로 사용할 수 있습니다 독립 변수로 y 및 종속 변수로 x을 갖는 선형 회귀를 수행 한 다음 yx 사이의 상관 관계를 보여줍니다. 훨씬 더 복잡한 것들이 가능합니다.

제 질문은 기본적으로 stata가 변수 할당/평가가 "매크로 할당/확장"형식을 취하는 언어의 더 큰 범주로 분류됩니까? 왜 언어가 이와 같이 설계 될지에 대한 설명과 다른 언어로 된 유사한 구문에 대한 보너스 포인트.

답변

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 20 years old" 

다음는, STATA 실제로 코드의 마지막 줄을 실행할 명령

display "I am `x3' years old" 

변환합니다. 먼저이 명령을 실행하여이 모든 것을 볼 수 있습니다 : set trace on.

약간의 차이가 있습니다. 대괄호는 명령을 변경합니다. 나는 이것이 다른 프로그래밍 언어와 실제로 다르다고 생각한다. 하나의 코드 행으로 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' 
} 

두 번째 예에서도 동일한 오류가 있습니다. r1r2은 변수가 아닙니다. 당신은이 작업을 수행 할 수 :

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

(I 실제로 머리 빨리 실행하는 가정입니다 동등한, foreach r of local mycommands { ... }를 입력 것이지만).

(2) 둘째, ++i은 유효하지 않습니다. 아마도 local ++i이라고 할 수 있습니다.

관련 문제