-
미스티컬은 마법진 형태로 PostScript 프로그램을 시각화하는 독특한 방식임
- 프로그래밍 구조를 고리(ring) 형태로 표현하며, 실행 배열, 비실행 배열, 딕셔너리 등 다양한 타입이 있음
-
시길(sigil) 이라는 특수 심볼을 통해 명령어나 변수, 문자열 등을 독창적으로 나타냄
- 정의 패턴이나 함수 선언에는 별도의 결합 기호(ligature) 표현이 적용되며, 사용자 맞춤 시길도 지원함
- 현재는 PostScript 프로그램을 그래픽 이미지로 변환하는 도구이며, 자체 인터프리터는 존재하지 않음
미스티컬(Mystical) 개요
미스티컬은 마법진을 닮은 프로그래밍 언어를 목표로 한 실험적 프로젝트임. 실제로는 마법진 형태로 PostScript 코드를 시각적으로 표현하는 방식이며, 이 문서에서는 이 방법을 '미스티컬'이라 명명함.
고리(Rings) 구조
- 미스티컬의 구조는 고리 형태를 중심으로 함
- 각 고리는 글자와 시길을 담고 있으며, 안쪽과 바깥쪽 경계선이 있음
- 프로그램의 메인 고리는 오른쪽(3시 방향)에서 시작해 시계 반대 방향(widdershins) 으로 진행함. 이는 PostScript의 각도 규칙과 마법진이 바깥에서 안으로 써진다는 개념을 반영함
- 하위 고리는 상위 고리의 접점에서 시작함
고리의 세 종류
-
실행 배열(Executable array) : PostScript의 {}에 해당. 내부와 외부에 단순 원형 경계와 별 모양, 시작/종료에는 연금술 기호 기반 심볼 사용
-
비실행 배열(Non-executable array) : PostScript의 []에 해당. 별 모양 없음, 시작/종료 삼각형 사용
-
딕셔너리(Dictionary) : PostScript의 <<>>에 해당. 다각형 형태에 이중 바깥 경계와 단일 안쪽 경계. 시작/종료 표시 동일
고리 안에 또 다른 구조가 들어올 때는 작은 점 또는 선으로 연결되어 계층을 시각적으로 표현함
PostScript 사용상의 제한
- PostScript에서 [ ] 또는 << >>를 미스티컬 규칙상 허용 불가 방식으로 쓸 수 있으므로 권장하지 않음
-
gsave/grestore, begin/end 등은 비균형적 구조에 더 많이 쓰이므로 일반 시길로 처리함
텍스트와 시길(Sigils)
- 고리 테두리에는 문자 또는 시길(특수 심볼)이 배치됨
- 시길은 연산자, 변수, 키워드를 나타냄
- PostScript의 /name은 삼각형 안에 이름이나 시길로, 문자열 ()는 두루마리 모양으로 표현
표준 시길(Standard Sigils)
- 내장 연산자 다수에 대해 고유 시길이 존재
- 보통 명령어의 이니셜, 개념의 그림, 또는 시각적 언어로 디자인됨
예: dup, copy, add, mul, neg, for, forall, repeat, if, ifelse, eq, ne, ge, gt, le, lt, moveto, lineto, arc, arcn, curveto, closepath, stroke, fill, gsave, grestore, translate, scale, rotate, setmatrix, currentmatrix, setrgbcolor, currentrgbcolor, setcmykcolor, currentcmykcolor, sethsbcolor, currenthsbcolor, setgray, currentgray, dict, begin, end, def, get, put, length 등
사용자 시길(User Sigils)
-
새 함수나 이름에 대해 런타임에 sigil_bank에 추가 가능
- 1-유닛 정사각형 내로 디자인 필요(좌표 변환 가능)
-
nstroke 사용 시 기존 시길과 동일한 서체 효과 가능
-
사용자 변수용 시길은 다양한 방식(글자 겹침, 다양한 시각적 언어 등)으로 제작 가능
- 공식 연산자 기반 새 이름은 표준 시길과 조합 가능
/name { ring } def 결합 시길(Ligature)
-
함수 정의 등에서 자주 쓰는 패턴을 위한 특수 시길 제공
- 이름 삼각형 아래에 연결선만 표현하며, 별도의 def 시길은 생략함
- 세 가지 고리 타입 모두에 적용 가능
- 그 외의 def 사용은 일반 시길로 처리
- 실행 배열 내에서만 적용하며, 딕셔너리 내에서는 사용상 혼란 가능성으로 제공 안 함
샘플 알고리듬
상단 그림은 퀵소트(Quicksort) 예시임
Euclid 최대공약수(GCD) 알고리듬 예시도 제공함. 해당 예시는 사용자 함수 /arg {exch def} def를 활용
미스티컬 이미지 생성 함수
모두 "mystical.ps"에 정의됨
-
mystical: 배열, 실행 배열, 또는 딕셔너리를 받아 내부 구조까지 재귀적으로 시각화. 전체 이미지는 단위 원에 맞게 스케일 조정
-
mystical_evoke: 이름을 받아 현재 딕셔너리에서 찾아 위와 같이 렌더링
-
mystical_evoke_label: 이름-def 결합 시길 추가, 이름 시길이 수직으로 보이게 방향 조절
위 함수들에는 _unscaled 버전도 존재. 이 경우 스케일 불가하여 고리가 매우 크게 출력됨
레이아웃 문제
- 현재 코드는 하위 원의 배치를 충돌 없이 최적화하지만, 보수적이라 배치가 과하게 펼쳐짐
- 예시 그림에서는 mystical_get_spell, mystical_make_evocation_ligature 등으로 파싱/배치 후, draw_sigil, draw_link 함수로 직접 조정해 그림을 출력함
- 향후 레이아웃 디폴트 설정을 개선할 예정임
프로그래밍 언어로서의 미스티컬
- 현재 미스티컬은 PostScript 프로그램을 그리는 도구임
- 미스티컬 이미지 자체를 해석 실행하는 인터프리터는 없음
- 사람이 이미지를 보고 PostScript 코드를 이해하거나, PostScript 프로그램으로 재작성하여 실행하는 방식임
- 언어적 논의는 추후로 미룸
다른 언어 적용 가능성
-
FORTH와 같이 연산자만으로 이루어진 언어에서는 활용 가능성이 큼
- 구조가 더 복잡한 언어에는 적용 시 고리가 과도하게 많아질 우려가 있음
github에서 다운로드
codeberg에서 다운로드
이 페이지는 2025-05-16에 Denis가 생성함