— JavaScript, 오늘의 함수, 함수형 프로그래밍 — 1 min read
오늘 발견한 재미있는 함수를 소개합니다
오늘은 mr
이라는 함수를 소개합니다. mr
은 Multiple Return의 약자입니다. 여러개의 값을 리턴하기 위해 사용하는 함수죠. go
나 pipe
같은 함수 안에서 사용합니다. 한번 살펴보겠습니다.
자바스크립트는 하나의 값만 리턴할 수 있습니다. (Go와 같은 언어에서는 자체적으로 이와 같은 기능을 지원합니다.)
1function sum(a, b, c) {2 return a + b + c;3}4console.log(sum(1, 2, 3)); // 65// go(1,2,3, sum, console.log); // 불가능6
7function sum_arr(arr) {8 return arr.reduce((a, b) => a + b);9}10console.log(sum_arr([1, 2, 3])); // 611go([1,2,3], sum_arr, console.log); // 6
여러개의 값을 인자로 전달해서 함수를 실행하기 위해선 반드시 직접 실행하거나 배열로 값을 전달해서 처리하도록 해야만합니다.
이때 mr
함수가 있으면 문제를 해결할 수 있습니다.
1go(mr(1,2,3),2 sum,3 console.log); // 6
mr
이라고 값들을 감싸서 전달하면 go
함수가 이 값을 다음 함수에 풀어서 전달합니다. 이와 같은 구조로 인해 기존의 go
함수를 고쳐줘야합니다.
1function go() { // 기존의 go2 return reduce(arguments, function(arg, fn) {3 return fn(args);4 })5}6
7function go() { // Multiple Return을 지원하는 go8 return reduce(arguments, function(arg, fn) {9 return arg.__mr ? fn(...arg) : fn(arg);10 })11}
달라진 것은 reduce
에게 전달되는 함수 내부에 삼항연산자로 인자에 __mr
프로퍼티가 참이면 인자를 풀어서 전달하고 그렇지 않으면 그대로 전달하도록 해준 것이 전부입니다. 이제 mr
이 어떤 모습일지 상상이 가지 않나요?
1function mr() {2 arguments.__mr = true;3 return arguments;4}
단지 arguments
객체에 __mr
이라는 프로퍼티를 붙이고 거기에 참 값을 넣어 그대로 리턴한 것뿐입니다. 이와 같은 방법으로 go
와 pipe
같은 함수 내에서 여러개의 값을 리턴할 수 있습니다.
1go(10,2 function(a) {3 return mr(a, 20, 30);4 },5 sum,6 console.log) // 60
자매품으로 일반 배열을 위한 to_mr
함수도 있습니다.
1function to_mr(arr) {2 return arr.__mr = true, arr;3}4
5go([10, 20, 30],6 to_mr,7 sum,8 console.log) // 60