함수형 언어와 명령형 기능을 결합한 CalcuList
초록
CalcuList는 교육용 함수형 언어로, 기본은 순수 함수형 프로그래밍을 제공하지만 프로그래머가 명시적으로 요청할 경우 제한된 명령형·부작용 기능을 사용할 수 있다. Python과 유사한 문법, REPL 기반 인터랙티브 세션, 문자열·리스트·JSON 기본 지원, 동적 타입 검사와 정적 타입 힌트를 결합한 설계가 특징이다.
상세 분석
CalcuList는 함수형 언어의 핵심 원칙인 ‘함수는 인자에만 의존하고 전역 상태를 변경하지 않는다’는 규칙을 유지하면서, 부작용을 필요에 따라 명시적으로 활성화한다는 독특한 설계 철학을 갖는다. 이를 위해 언어는 전역 변수와 함수 정의를 구분하고, 함수 내부에서는 전역 변수에 접근할 수 없게 하여 순수성을 보장한다. 부작용을 허용하려면 함수 정의 뒤에 ‘!’와 같은 특수 구문을 사용하거나, 변수 할당문을 명시적으로 작성해야 한다. 이러한 접근 방식은 Haskell의 모나드 기반 부작용 관리와는 달리, 속성 문법(Attribute Grammar) 기반의 의미 규칙을 활용한다. 속성 문법은 구문 트리의 각 노드에 의미적 속성을 부여해, 전역 변수의 선언·사용 여부를 컴파일 시점에 검증한다.
타입 시스템은 ‘동적 강제 타입 검사’를 기본으로 하면서, 기본형(double, int, char, bool, null)과 복합형(string, list, json) 그리고 함수 자체를 일급 객체로 취급한다. 연산자 오버로드가 풍부하게 제공되는데, ‘+’는 숫자 연산뿐 아니라 문자열·리스트 연결을 지원한다. 슬라이스 연산은 Python과 유사하게 구현되어 문자열·리스트의 부분 추출을 가능하게 한다. 리스트는 얕은 복사와 깊은 복사를 명시적으로 구분한다. ‘|’ 연산자는 Prolog에서 차용한 ‘prepend’ 연산자로, 새로운 리스트를 기존 리스트 앞에 원소를 추가하면서도 원소 자체는 공유한다(얕은 복사). 반면 슬라이스 연산은 새로운 리스트를 복제하여 깊은 복사를 수행한다. 이러한 설계는 메모리 사용과 성능 트레이드오프를 학습자에게 직접 체험하게 한다.
재귀 함수 구현 시 ‘tail recursion’ 최적화가 언어 차원에서 지원된다. 예시로 제시된 rev 함수는 꼬리 재귀 형태로 구현돼 리스트 뒤쪽을 순차적으로 처리하면서 중간 결과를 누적한다. 이는 리스트 접근이 선형 스캔 기반이므로, 비효율적인 listRev(O(n²))와 대비해 rev가 O(n) 성능을 보이는 것을 실험적으로 !clops 명령어로 측정한다. CLVM( CalcuList Virtual Machine) 은 스택·힙·코드·출력 메모리와 레지스터를 갖춘 추상 머신이며, 각 고수준 연산을 마이크로 명령어 집합(clops)으로 구현한다. 이를 통해 교육자는 고수준 언어와 저수준 구현 사이의 비용 차이를 직접 관찰할 수 있다.
CalcuList는 JSON 객체를 첫 번째 시민으로 지원한다. JSON은 키-값 쌍으로 구성된 동적 구조이며, 리스트와 동일하게 얕은 복사·깊은 복사가 구분된다. 이는 현대 웹·데이터 처리 환경을 학습에 접목시키는 의도다.
전체적으로 CalcuList는 “함수형 핵심 + 선택적 명령형”이라는 두 축을 명확히 구분함으로써, 학습자가 순수 함수형 프로그래밍의 장점을 체득하고, 필요 시 부작용을 안전하게 도입하는 과정을 단계적으로 경험하도록 설계되었다. 이는 함수형 패러다임이 아직 널리 받아들여지지 않은 교육 현장에서, 함수형 사고방식을 자연스럽게 습득하게 하는 실용적 접근이라 할 수 있다.
댓글 및 학술 토론
Loading comments...
의견 남기기