저번까지 만들었던 건
#을 이용해 컴파일러에 문자열 토큰을 따로 넘기는 것. 그걸로 매크로를 만들었던 것.
이번에는 그 넘겨받은 토큰들을 따로 컴파일하거나 합치는 기능을 추가해서 일종의 메타프로그래밍 기능으로 확장시켰음.
그런데 여기서도 스택지향 프로그래밍을 사용하게 만들었음.
#One #Two
위의 코드는 컴파일러 토큰 스택에 One, Two를 차례로 넘기고, 결과는 [One, Two].
이 때 포스처럼 over, swap, rot 등의 스택 조작을 수행할 수 있음.
#One #Two ttuck tover \ #Two #One #Two #One
위의 코드는 우측의 주석처럼 평가됨.
#One #Two concat eval \ OneTwo
concat 으로 두 토큰을 합칠 수 있고, eval로 토큰을 따로 컴파일할 수 있음. OneTwo라는 코드가 실행됨.
이제 이 기능들로 살짝 복잡한 매크로도 만들 수 있음.
#for {
trot tdup eval -- trot trot tdup #$ tswap concat eval to \ start -- $var to
loop
tdup #$ tswap concat eval dup call ++ swap to \ $var dup call ++ swap to
tdup eval tdrop tnip eval < \ var end <
while
\ code
} define ( #start #end #var -- )
for문은 따로 구현하지 않았었는데 대충 매크로로 구현해봤음.
이걸로 이제 별찍기를 쉽게 만들 수 있게 됐음.
#0 #5 #i for
#-1 #i #j for
'*' putc
end
cr
end
*
**
***
****
*****
기존의 loop-while-end 문으로 치환하면, 즉 실제 생성되는 코드는 다음과 같음.
0 -- $i to
loop
$i dup call ++ swap to
i 5 <
while
-1 -- $j to
loop
$j dup call ++ swap to
j i <
while
'*' putc
end
cr
end
단점은... 쓰기 어렵다는 거.
매크로에 사용할 수 있는 토큰도 트릭을 좀 써야지만
6개 정도 까지 사용할 수 있을 듯 함.
추가로
VS Code에서 쉽게 쓰려고 간단한 코드 하이라이팅 확장을 만들었음.
언어 구조가 병맛이라 좋게는 못 만들고 그냥 내장 키워드나 토큰, 숫자 정도만 하이라이팅하게 만들었음.
댓글 0