나는 나만의 언어를 만들고 싶었다. 그리고 지금도 그렇다.
나만의 언어를 생각하는 나에게 영감을 준 것은 많다: 람다 대수, 함수형 언어, 논리형 언어 등등.
이런 것들을 보면서 이왕 만들 거면 독창적이고 특화된 언어를 만들어야지라는 생각이 들었다.
그러던 중 며칠 전 아이디어가 떠올랐다:
"만약 객체가 문자열 뿐이고 타입은 논터미널 심볼이라면 어떨까?",
"그리고 객체 o의 타입이 t일 때 o는 t를 시작 심벌로 하는 문맥자유문법의 언어라면 어떨까?".
여기에 살을 붙여보았다:
프로그램은 인터프리터에서 돌아가며 1항 술어 Main()에 대하여 스트링 arg을 받아서 Main(arg)의 진리값을 결정하는 것을 목표로 하자.
모든 상수와 함수는 타입을 가지며 결국 문자열로 치환된다- 이렇게 하면 문자열을 추상적으로 다룰 수 있다.
상수는 0항 함수로 간주될 수 있으며 함수는 TRS(term rewrite system)에 의하여 평가된다.
논리식 C, P1, P2, ...에 대하여 코드 "P1, P2, ... / C."는 P1, P2, ...가 참인 게 밝혀지면 C도 참이 된다는 뜻이다.
다음과 같이 코드를 짤 수 있다.
lambda_abstraction : TermVariable -> LambdaTerm -> LambdaTerm.
application : LambdaTerm -> LambdaTerm -> LambdaTerm.
variable_itself : TermVariable -> LambdaTerm.
LambdaTerm => x:TermVariable == variable_itself x.
LambdaTerm => "(" m:LambdaTerm " " n:LambdaTerm ")" == application m n.
LambdaTerm => "(" x:TermVariable " |-> " m:LambdaTerm ")" == lambda_abstraction x m.
substitute : LambdaTerm -> TermVariable -> LambdaTerm -> LambdaTerm.
Equal(LambdaTerm, LambdaTerm).
For x:TermVarialbe, m,n:LambdaTerm, / Equal(application (lambda_abstraction x m) n, substitute m x n).
For m:LambdaTerm, / Equal(m, m).
For x:TermVariable, m,n:LambdaTerm, Equal(m, n) / Equal(lambda_abstraction x m, lambda_abstraction x n).
For m,p,q:LambdaTerm, Equal(p,q) / Equal(application m p, application m q).
For m,p,q:LambdaTerm, Equal(p,q) / Equal(application p m, application q m).
입출력과 명령형 서브언어- 메모리를 사용할 수 있다 -를 위한 1항 술어 System()를 추가하고
멤버함수와 모듈을 추가하면 더욱 풍부한 언어가 될 것이라는 생각이 들었다.
이제 해야할 일이다:
1. 어떻게 축약표현을 처리할 수 있을까?
위 경우에는 LambdaExpression이라는 별도의 타입을 선언하여
변환 함수 uncontraction : LambdaExpression -> LambdaTerm를 작성하는 게 최선인가?
2. 술어논리 시스템을 어떻게 구현할 것인가?
3. 문자열을 파싱하는- 생성자를 문자열에 적용하는 - 장치를 어떻게 만들 것인가?
일단, 형식언어와 오토마타 책을 읽어야 겠다.
댓글 0