간단한 인터프리터 언어를 만들고 있다.

LISP와 거의 비슷하다.

식은
(연산자 피연산자1 피연산자2 ... ) 예: (+ 2 6)
의 형식이다.

그러나 잘 쓰이지 않는 문자인 `를 활용하여
(피연산자1`연산자 피연산자2) 예: (2`+ 6)
(피연산자2`피연산자1`연산자) 예: (6`2`+)
처럼 쓸 수도 있게끔 하는 것을 고려하고 있다.
코딩하기엔 좀 귀찮겠지만 가독성은 좋아진다.

모든 요소는 객체이다.
연산자도 객체이도 피연산자도 해석순간에 객체로 바뀐다.
식의 반환값도 객체이다.
객체는 실제 값을 담은 주소와 타입 정보만을 담은 구조체이다.

(+ 2 (* 2 3)) 처럼 쓰면,
(* 2 3)이 6이라는 객체를 반환,
(+ 2 6) 으로 해석해 최종적으론 8이라는 객체를 반환한다.

연산자도 객체이고, 배열에 넣거나 연산자의 반환값으로 하거나 피연산자로 쓰거나 할 수 있다.

기본적인 자료형은 C/C++ 와 동일하며 객체로 래핑하여 쓴다.
배열, 덱 등은 객체의 주소를 담는 컨테이너로 구현된다.
그 컨테이너도 객체로 래핑하여 쓴다.

그러나 문자열은 객체를 담는 것이 아니라 값 자체를 담는데,
문자열의 특정 문자를 참조한다면
그 문자의 주소를 담은 임시 객체를 참조하게 된다.

연산자는 내장 연산자나 C로 구현된 연산자의 경우
변경이 불가능하지만 접근은 가능한 유사 객체이나,

직접 작성한 연산자의 경우
코드와 반환값의 타입 정보등의 객체를 가진 객체이다.
참고로 피연산자는 동적배열로 들어오는데,
피연산자가 무한하게 있어도 된다.

코드도 객체이며 실제 코드 텍스트파일 내에서 특정 위치를 가진다.
코드인 부분은 {}로 표시해줘야 한다. 그렇지 않으면 즉시 해석되어 결과값인 객체를 반환한다.
조건문과 반복문도 코드를 실행하는 연산자이다.

예컨대
(if (=> n 1) {
...
})
와 같이 쓰인다.
만약에, 코드를 변수로 선언해뒀다면,
중괄호가 들어갈 자리에 그 변수의 이름을 쓰면 된다.
반복되는 코드는 저장해놓고 쓰는 것이 가능하다.

문자열도 코드로 변환할 수 있으며
이 겅우 기존의 파일에서 위치만 참조할 수 없으므로,
별도의 문자 정보까지 같이 저장하게 된다.
반대로 코드를 문자열로 저장하는 것도 가능하다.
때문에 코드의 내용을 조작하는 것이 가능하다.

해석 중 파싱되는 키워드도 객체이다.
문자열을 키워드로 형변환할 수도 있다.
"print" 라는 문자열을 이용해
print라는 변수를 참조한다거나,
해당하는 연산자를 실행하는 것이 가능하다.

변수는 타입을 정해놓고 선언한다.
그러나 이미 선언된 타입의 형을 변환하는 것도 가능하다.
연산자는 변수로 저장하고 사용하는 것이다.
연산자는 변수이고, 코드 객체를 포함하므로,
연산자가 스스로를 수정할 수 있다.

기본적으로 객체는 변수에 대입하여 사용하는데,
주소를 공유할 수도 있다.
레퍼런스 카운트를 사용하여 GC를 사용하지 않는다.
순환 참조를 한다면 카운트가 증가하지 않는다.

변수뿐만 아니라, 배열의 원소까지도 다른 변수나 다른 배열의 원소의 주소를 공유할 수 있다.

구조체는 여러 객체를 가지고 있는 객체인데,
각 인덱스별로 이름을 가진 배열로 구현된다.

기본적으로 매우 단순한 문법을 가졌기에
파서니 렉서니 필요가 없으며 그냥 한 글자씩 해석한다.
또한 변수명이나 연산자명 등 키워드는 Trie로 찾는다.

지금까지 구현한 부분은 일단 간단한 수식 계산까지이지만,
여기까지로도 기본적인 구조는 구현한 것.

앞으로 구현해야할 것은
1. 변수의 선언과 삭제
2. 코드 구조체와 제어문, 반복문
3. 연산자 구조체
4. 구조체 구조체

어떻게 생각함?
군대에 와서 할 게 없어서 시작한 프로젝트임.