드디어 방향을 정했습니다.
식별자는 다음과 같이 4종류가 있습니다
타입: 대문자로 시작, 밑줄문자 없음, 괄호 안 붙음.
술어: 대문자로 시작, 밑줄문자 없음, 괄호 붙어야함.
생성자: 대문자 없음, 밑줄문자 있어도 됨, 괄호 붙어야함.
변수: 대문자 없음, 밑줄문자 있어도 됨, 괄호 안 붙음.
모든 생성자는 문자열을 값으로 가집니다.
생성자들의 결합인 항도 문자열을 값으로 가집니다.
문자열 "succ(zero())"는 그냥 문자열입니다.
문자열 'succ(zero())'는 항의 값입니다.
* 연산자로 두 문자열을 접속할 수 있습니다.
술어에게 문자열을 주어 그것을 호출합니다.
술어가 문자열을 받아 호출되면
파서가 술어의 타입을 보고 문자열을 항으로 바꾼 뒤
패턴 매칭을 하고 항을 묶습니다.
코드는 (타입 정의, 술어 선언 또는 술어 정의)의 반복입니다.
다음은 예시코드입니다. "-" 뒤에는 주석이 옵니다.
Nat - 타입 정의
{
succ(n: Nat) = "s" * 'n'.
zero() = "z".
}
- 'succ(zero())' = "sz".
Main(Nat). - 술어 선언
-이하 술어 정의
/ Main(zero()). - 첫번째 항에 zero()가 묶이면 참이라는 뜻입니다.
Main('n') / Main(succ(n)). - 첫번째 항에 succ(n)이 묶이면 Main('n')이 참일 때 참이라는 뜻입니다.
이때 인터프리터에게 Main("ssz").라고 물으면 yes라고 답합니다.
여기서 멤버함수를 넣을까 말까 고민 중입니다.
여러분의 많은 관심 바랍니다.
헬로월드랑 피보나치 수열 예시점
이건 더하기부터 재귀로 구현해야돼요. Plus(Nat, Nat, Nat). / Plus(n, zero(), n). Plus(i, j, k) / Plus(i, succ(j), succ(k)). << Plus("z", "sz", x). >> x = "sz". - 훈다리 훈다리
/ F("z", "sz"). / F("sz", "sz"). F(n, x), F(succ(n), y), Plus(x, y, z) / F(succ(succ(n)), z).