3. 더하면서 배우는 함수 호출

  • '평범한 한글'은 함수형 난해한 언어이다. 당연히 함수를 만들고 호출하는 방법이 마련되어 있다.
TMI: 함수에 대하여
  • 함수는 기본 제공 함수사용자 정의 함수로 나눌 수 있다.
    • 기본 제공 함수: 평범한 한글에서 미리 제공하는 함수. 정수 리터럴이 함수 이름이 된다.
      • 💡
        정수 리터럴(integer literal): 평범한 한글에서 ㄱㄴㄷㄹㅁㅂㅅㅈ로 이루어진 문자열. 앞의 글에서는 편이상 한글 숫자라고 불렀지만 정식 명친은 정수 리터럴이므로, 지금부터는 이 이름을 사용한다.
    • 사용자 정의 함수: 사용자가 프로그램에서 정의하는 함수로, 함수 객체이다.
  • 함수는 최소 0개의 인수를 가지며, 한 개의 객체를 내놓는다.
 
 
  • '평범한 한글'이 계산을 하고 연산을 수행할 수 있는 이유는 함수가 있기 때문이다.
  • 함수를 부를 때는 [인수 0], [인수 1]...[인수 n][함수] ㅎ[인수의 갯수] 형태를 사용한다.

두 자리 수 더하기

  • 평범한 한글은 한글이 아닌 모든 기호를 무시하므로 연산을 위해서 +, -, *, / 등의 기호를 쓰지 않는다.
  • 덧셈은 기본 제공 함수인 을 사용한다. ('더하기'라고 외우면 편하다.)

0 + 0 = ? - 함수 호출하는 방법

  • 0 + 0 을 평범한 한글로 계산해보자.
ㄱ ㄱ ㄷ ㅎㄷ
▶️
0
  • 처음에 오는 ㄱ ㄱ은 함수에 전달되는 인수이다. 정수 리터렬 0을 두 번 쓴 것.
  • 은 더하기를 수행하는 기본 제공 함수이다.
  • ㅎㄷ는 두 개의 인수()를 갖는 함수(여기서는 ㅎㄷ 앞의 함수)를 호출()하는 단어이다.
  • ㄱ ㄱ ㄷ ㅎㄷ를 굳이 다른 언어의 함수 호출로 바꾸면 ㄷ(ㄱ, ㄱ) 과 같은 느낌이랄까? (심지어 평범한 한글의 호출문이 다섯 글자로, 다른 언어의 호출문보다 한 글자 적다.)
 

초등학생 더하기

  • 더하기를 몇 번 더 해보면서 함수 호출 방법을 연습하자.
ㄴ ㄴ ㄷ ㅎㄷ
▶️
2
  • 함수에 이라는 두 개의 인수를 전달해서 더하기를 실행한다. 1 + 1 의 결과는 당연히 2.
ㄴ ㄷ ㄷ ㅎㄷ ㄹ ㅂ ㄷ ㅎㄷ ㅈ ㄴ ㄷ ㅎㄷ
 
▶️
3 8 8
 
  • 첫 줄부터 차례대로 1 + 2, 3 + 5, 7 + 1.
ㄱㄷㄱ ㄱㄴㄱ ㄷ ㅎㄷ ㅁㄴㄱ ㅈㄹㄱ ㄷ ㅎㄷ ㄹㅁㄴ ㄴ ㄷ ㅎㄷ
▶️
24 43 100
  • 좀 더 큰 자릿수에서도 계산해 보자. 16 + 8, 12 + 31, 99 + 1 이다.
  • 10진수를 정수 리터럴로 변환할 때에는 언제나 부호에 주의하자!
    • 💡
      처음 위의 코드를 짤 때 호기롭게 ㄱㄷ ㄱㄴ ㄷ ㅎㄷ 라고 써서 실행하는 순간 -24 를 얻었다. 내 머리에 절망했던 순간. 숫자의 개수가 홀수이면 양수, 짝수이면 음수라는 걸 잊지 말자! 부호를 정하기 위해서 오른쪽 끝에 을 덧붙인다는 것도!
       

'나 과제 다 했다'의 진실

  • '평점한 한글'의 언어 명세를 읽다가 나 과제 다 했다.에서 무릎을 탁 쳤다! 세상에, 이게 소스 코드야?
  • 더구나 나 과제 다 했다.는 무려 -55라는 결괏값으로 깔끔하게 수렴한다! 놀랍다.
  • ㅎㄷ의 뜻을 배운 자에게 진실의 길은 열릴 것이다!
  • 나 과제 다 했다에서 초성만 남기면 다음과 같다.
ㄴ ㄱㅈ ㄷ ㅎㄷ
▶️
-55
  • 인수 ㄱㅈ을 받아서 더하기() 함수를 호출(ㅎㄷ)하는 거였다.
  • 위의 코드는 1 + -56 이므로 결괏값으로 -55가 출력된다. (아직도 ㄱㅈ56으로 보이면 정수 리터럴과 더 친해져야 한다.
  • 정수 리터럴로 자유롭게 평범한 한글을 만들어보자.
설거지랑 청소도 다 했다 추석때 새배를 더 했다. 자기 지금 또 하트?
▶️
-1807 421 -14
  • 거센소리와 된소리도 예사소리로 취급하는 평범한 한글!
 

세 자리 이상 더하기

다음에 전달할 인수의 개수를 바꾸어주면 세 자리 이상의 수도 더할 수 있다.
ㄴ ㄴ ㄴ ㄷ ㅎㄹ
▶️
3
  • ㄴ ㄴ ㄴ처럼 1을 세 번 써 주고 으로 더하기 함수를 써 준 다음 ㅎㄹ로 인수가 세 개라고 알려준다.
  • 1 + 1 + 1 = 3
ㄴ ㄹ ㅂ ㅈ ㄷ ㅎㅁ
▶️
16
  • 네 개의 인수를 전달하려면 ㅎㅁ을 쓴다.
  • 1 + 3 + 5 + 7 = 16
 
ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅈ ㄱㄴㄱ ㄴㄴㄱ ㄷㄴㄱ ㄷ ㅎㄷㄴㄱ
▶️
55
  • 1부터 10까지 더하는 코드.
  • 열 개의 인수를 전달하기 위해서 ㅎㄷㄴㄱ를 사용했다.
 

인수가 함수에 전달되는 법

  • 만약에 실제로 전달하는 인수와 다음에 오는 인수의 개수가 다르면 어떻게 될까?
ㄱ ㄴ ㄷ ㄷ ㅎㄷ
▶️
0 3
  • 세 개의 인수를 쓰고 로 더하기를 쓴 다음 ㅎㄷ 으로 두 개의 인수로 호출하라고 했더니 결과로 0과 3이 나왔다. ⇒ 함수에는 1과 2만 전달되고 0은 그대로 남았다.
  • 폄벙한 한글에서 함수를 호출하면 함수 이름(여기서는 )에서 가장 가까운 인수의 개수 만큼 전달된다.
  • 이런 특징 때문에 다음과 같은 코드를 쓸 수 있다.
ㄴ ㅅ ㅈ ㄷ ㅎㄷ ㄷ ㅎㄷ
▶️
14
  • 위의 코드는 다음처럼 쪼개볼 수 있다.
    • ㅅ ㅈ ㄷ ㅎㄷ ㄷ ㅎㄷ
      1. 위와 같이 두 개의 함수 를 호츨하면 안쪽에 있는 ㅅ ㅈ ㄷ ㅎㄷ 가 먼저 실행되어 13을 돌려준다.
      1. 바깥 쪽에 있던 과 안쪽 결과인 ㅂㄴㄱ(13)이 합쳐져서 ㅂㄴㄱ ㄷ ㅎㄷ 로 계산된다. 결과는 14.
      1. 위 코드를 수식으로 나타내면 1 + (6 + 7)) 이 돤다.
       
  • 한 번 더 꼬아보자.
ㅁ ㄴ ㅅ ㅈ ㄷ ㅎㄷ ㄷ ㅎㄷ ㄷ ㅎㄷ
▶️
18
  • 함수를 세 겹으로 둘러쌌다.
    • ㅅ ㅈ ㄷ ㅎㄷ ㄷ ㅎㄷ ㄷ ㅎㄷ
  • 수식으로 바꾸면 4 + (1 + (6 + 7)).
  • 평범한 한글은 굉장히 자유로운 형식으로 소스 코드를 쓸 수 있으므로 다음과 같이 쓸 수도 있다.
ㅁ ㄴ ㅅ ㅈ ㄷ ㅎㄷ ㄷ ㅎㄷ ㄷ ㅎㄷ
(ㅁ (ㄴ (ㅅ ㅈ ㄷ ㅎㄷ) ㄷ ㅎㄷ) ㄷ ㅎㄷ)
  • 어떻게 표현하든 결과는 모두 18.
  • 하지만 평범한 한글의 취지가 자연스러운 한글의 표현이니까 줄바꿈이나 괄호를 뺀 모양에 익숙해지면 재밌지 않을까? 😃
 
💡
이런 특징은 Forth 언어와 매우 닮았다. 연산을 할 때 스택을 사용하는 Forth에서는 후위 표기법을 쓰기 때문에 다음과 같이 코드를 표기한다. 4 1 6 7 + + + 일단 수들을 모두 스택에 쌓아놓고 + 가 더미에서 두 개 씩 꺼내서 이를 계산한다. 평범한 한글의 함수 호출(식 평가)과 매우 닮아 있다.