Array programming language
홍민희고등학교 때부터 생각해오던 프로그램이 있는데, 바로 Mac OS X에 들어있는 Automator의 Windows 클론입니다. 사실 경진대회에 내려다가 포기했던 겁니다.
아무튼, 여기에 쓰일 스크립트 언어를 가끔 생각해보는데, 배열 프로그래밍(이라고 해야 하나요?) 언어가 좋을 것 같습니다. 아이디어는 간단한데, 보통 C를 배운 친구들에게 Java를 가르칠 때 "Java의 변수는 기본적으로 다 포인터란다"라고 말하는 방식으로 설명하자면, "배열 프로그래밍의 레퍼런스들은 기본적으로 다 배열"입니다.
기존 프로그래밍 언어에서 모든 타입 형식들이 배열이라고 상상합니다.
int[] factorial(int[] n)
n * factorial(n - 1)
저런 식이라면 호출할 때는 어떻게 해야 할까요?
>>> factorial({4})
==> {24}
>>> factorial({4, 7, 8})
==> {24, 5040, 40320}
사실 함수에서 쓴 n - 1같은 표현은, 실제로는 map처럼 작동해야겠죠. map(int(int x) x - 1, n)로요.
아까 썼던 표기법을 Array programming language에 어울리게 좀 정리하면 이렇게 될 것 같습니다.
int factorial(int n)
n * factorial(n - 1)
쓸 때는?
>>> factorial(4)
==> 24
>>> factorial(4, 7, 8)
==> 24, 5040, 40320
정리하자면...
- 모든 연산자의 피연산자와 함수의 인자 타입은 기본적으로 배열이다.
- 모든 연산은 기본적으로
map처럼 작동한다. 즉,1 + 2는3이고,(1, 2, 3) + 1은2, 3, 4다. - 대신 모든 함수는 단 하나의 인자만을 갖는다.
그냥 예제만 보자면 list랑 차이가 없는 것 같은데요.
array만의 장점이 있어야 하지 않을까요?
흠... 모든 것이 배열이면 (1, 2, 3) + 1 이 아니라 (1, 2, 3) + (1) 이 되어야 하는 것 아닌가요? 그리고... (1, 2, 3) + (1, 2)는?
생각해보니 표기법을 바꾸면 큰 문제는 없을 것 같기도 합니다.
(1, 2, 3) + (1, 2)는 아래처럼 쓰면 되겠죠.+는 결국 말 그대로 총합(sum)을 구하게 되는군요.컴마는 Perl의 그것과 비슷하게 작동합니다. 모든 배열은 플랫(flat)하게 됩니다.
생각해보니
+연산은 피연산자가 둘이라서 저런 식으로 정의하기 힘들 것 같군요.흥미로운 생각이긴 합니다. 저는 C와 C++를 많이 하다보니 배열을 토대로 구조를 만들어나간 경우가 많았습니다. 홍민희씨는 Python을 해서인지 map을 기본적인 연산으로 놓고, 했던 것 같구요. 홍민희씨의 글을 읽어보면 문법이 거의 없는 무한확장이 가능한 programming 언어를 많이 아시는 것 같은데 이번 것도 같은 목적으로 시작한 것이겠죠.
하지만 이것을 일반화하면 결국 LISP이 될 것 같습니다. 일반화를 시도하고자 한다면 일차원이 아닌 것도 다뤄야 할텐데 그 부분에 대한 기본적이 복안이 있으신가요?
(1, 2, 3) + (1, 2)의 문제는 곱셈의 분배법칙 처럼 적용하면 괜찮을 것 같다는 생각을 합니다. 즉 (1, 2, 3) + (1, 2) = (2, 3, 4), (3, 4, 5)
하지만 모든 함수는 단 하나의 인자만을 갖는다는 것을 결과에도 적용하면 ((2, 3, 4), (3, 4, 5))이 되어야 할테죠...?
사실 용도 자체가 general-purpose한 것이 아니라, Automator 클론을 만드는데, 거기서 필요한 스크립트 언어로서 생각중인 것이라서 너무 많은 것에 대한 고려는 필요하지 않은 것 같습니다. 수식을 중심으로 예제를 쓰긴 했지만, 실제로 쓸 때 수식이 얼마나 필요할까도 의문이구요.
생각해보니 이항연산 없는 수학적 언어가 존재할 수 있는지 의문이군요... ^_^
수학은 무엇인가를 평가할 때(evaluation) 맞줄이거나(reduction) 분해합니다(decomposition). 분해는 확장이라고도(expansion) 하는 것 같군요.
하여간 늘렸다 줄였다하는 것을 우리는 정말 많이 합니다. 다중화(multiplex)와 역다중화(demultiplex)도 그런 거구요.
단항연산으로 단항만으로 결과를 내고자 한다면 흠... 뭔가 상당히 다른 차원 이야기가 될 것 같네요... 양자 컴퓨터를 공부해보면 좀 힌트가 있을런지...
결국 원소의 변화는 존재해도 통합과 분해가 없어지는 것인데, 어찌보면 정보의 손실이 없어진다고도 할 수 있겠습니다.
이상 저도 알 수 없는 헛소리였다는... (-_-)a
APL이나 J가 여기에 가깝지 않나요? (물론 문법이 난해하긴 하지만)
네, APL 계열 언어들이 저런 식이긴 합니다.