2012-03-16 3 views
5

저는 프로그래밍 언어로 Lua을 정말 좋아하지만, 모든 로컬 변수에 "local"을 입력해야한다는 것은 믿을 수 없을 정도로 버그입니다.내 DSL for Lua가 작동합니까 ...? (이것은 너무 단순한 것 같습니다)

단지 코드가 좀 어지럽게 보입니다.

그래서 나는 다음과 같은 변수 명명 규칙을 사용하기 위해 Lua 위에 도메인 특정 언어 (DSL)를 만들 수 있습니까? 변수 이름은 모두 대문자 인 경우

  1. , 다음 글로벌 변수 그밖에
  2. 이야, 변수는 local 변수

질문은 다음과 같습니다겠습니까이 작품 - 예 또는 아니오? 즉

:

-- In Lua 5.2 
isGlobalinLua = "is global in default Lua" 
GLOBALVAR  = "is global var in default Lua" 
local localvar = "is local var in default Lua" 

-- In my DSL Lua language 
isLocalinDSLLua = "is local in DSL Lua" -- translates to: local isLocalinDSLLua = ... 
GLOBALVAR  = "is global DSL Lua" 
localvar  = "is local var in DSL Lua" -- translates to: local localvar = ... 

그래서 지금, 기본 루아에 다음 코드 :

MYGLOBAL = 10 
a = 1 
if a > 1 then 
    b = 2 
    print b 
else 
    c = 3 
    print c + MYGLOBAL 
end 

UPDATE : 내 DSL의 루아와

myglobal = 10 
local a = 1 
if a > 1 then 
    local b = 2 
    print b 
else 
    local c = 3 
    print c + myglobal 
end 

로컬 기능은 무엇입니까?

다음 코드는 어떻게 작동합니까?

myfunc = function (...) -- local myfunc = function (...) 

모든 대문자로 모든 대문자를 작성하고 싶지는 않습니다.

어쩌면 난 그냥 기능을 무시하고 'local'식별자가 필요합니다 ... 생각?

+0

흥미로운 질문입니다. +1 이것이 올바른지 또는 올바른 일을하는 것이 무엇인지보고 싶습니다. –

+3

물론이 작업을 수행 할 수 있습니다. DSL을 읽고 루아 소스를 출력하는 전 처리기를 작성하십시오. 이것은 사소한 일이 아니며 그것이 얼마나 가치있는 일인지 분명하지 않습니다. 필자는 구현 언어와 동일한 수준의 추상화 수준에서 작동하는 DSL의 작은 부분을 개인적으로 보았습니다. 그들은 시간을 절약하거나 오류를 예방하지 않습니다. "도메인 특정"언어의 "도메인"은 대개 최종 사용자 도메인을 나타냅니다. 그러한 게임 플레이어, 회계사, 사업가 등. –

+0

그래서 1 년 후,이 아이디어에서 무엇이 나왔습니까? – lhf

답변

3

Moonscript에는 기본적으로 모든 변수가 로컬로 있으며, 내보내기 키워드를 사용하여 전역을 선언하면됩니다. 매우 멋진 차세대 언어 인 coffeescript와 비슷한 언어이며 루아에서 컴파일됩니다. 내가 루아를 사용할 때마다 나는 그것을 사용한다.

foo = 'bar' -- local 
square (x) -> x*x -- local 

-- globals 
export square 
export MY_GLOBAL = 12 

export class Foo 
    new: (bar) => @bar = bar -- self.bar = bar 
    get_bar: => @bar 
+0

불행히도 저는 coffeescript 팬이 아닙니다. 내가 나머지를 사용하지 않고 사용하고 싶은 Moonscript 부분을 어떻게 빼낼 수 있는지 알고 있습니까? – nickb

5

원하는 변경은 비교적 간단하므로 기본적으로 두 가지 옵션이 있습니다. 당신은 Metalua을 시도 할 수 있습니다 :

Metalua는 언어와 제공하는 컴파일러입니다 ... 리스프 방언 또는 템플릿 하스켈에 의해 offfered 무슨 전력 유사한

  • 전체 매크로 시스템을; 조작 된 프로그램은 소스 코드, 추상 구문 트리 또는 임의의 조합으로 볼 수 있습니다. 어느 것이 더 나은 작업이든 상관 없습니다.
  • 동적으로 확장 가능한 구문 분석기로 나머지 언어와 잘 어울리는 구문으로 매크로를 지원할 수 있습니다.

아니면 token filters를 사용할 수 있습니다

당신이 검사하고 그들이 파서에 가기 전에 는 렉서에서 오는 토큰의 흐름을 바꿀 수있는 기회를 제공함으로써 토큰 필터 작품

. 토큰 만 보게되면 토큰을 토큰으로 만 생성 할 수 있습니다. 렉서에 오는 텍스트를 볼 수 없으며 텍스트를 생성하여 렉서에 들어갈 수 없습니다.

두 가지 방법 모두 장단점이 있습니다. Metalua는 루아에서 고수준 언어 수정을 할 수있게 해 주지만 학습 곡선은 가파릅니다. 토큰 필터를 사용하면 토큰 스트림을 간단하게 수정할 수 있지만 제한된 전원을 사용할 수 있습니다 (2005 talk 참조).

할당에서 소문자 시작 식별자가 모두 소문자로만 적용되기 전에 local을 삽입해야하기 때문에 토큰 필터로 충분하다고 확신하지 못합니다. 다음 코드는 어떻게됩니까?

a = 1 
a = a * a 

local으로 변환 하시겠습니까? 그렇지 않으십니까?

local a = 1  vs. local a = 1 
a * a     local a = a * a -- valid in Lua, creates a new variable 
+0

전자는 "a"가 이미 정의되어 있다고 가정합니다. – nickb

3

예,이 작업을 수행 할 수 있지만 그 결과는 "도메인 관련 언어"라고하지 않습니다. 이것을 "전처리 기"라고합니다.

도 역시 Lua —의 문제로 인해 도청되었는데 switch 또는 case 문이 부족합니다. 실제로이 기능을 지원하기 위해 구현을 수정하지 않았습니다. 그러나 결국 나는 내가 사용했던 방언으로 프로그래밍하는 것을 신경 쓰지 않기로 결정했습니다.

C 프로그래밍 기술을 보유하고 있다면 루아 구현은 매우 깨끗하며 목표를 달성하는 가장 쉬운 방법은 구현을 수정하는 것입니다.

관련 문제