JSON으로 코딩하는거 만들기

무식이·2023년 3월 16일
0

JSON으로 코딩을 한다?!

나는 최근에 난해한 프로그래밍 언어를 보고 무언가를 생각했다.
JSON으로 한번 코딩을 해보자고.

그래서 만들어보았다.

JSON

[
  {
    name: "memo",
    value: "처음 로그"
  },
  {
    name: "variable",
    type: "const",
    id: "test_variable",
    value: "테스트 변수"
  },
  {
    name: "print",
    arguments: {
      value: [
        "안녕 ${test_variable}"
      ]
    }
  },
  {
    name: "loop",
    arguments: {
      variable: "i",
      start: 0,
      end: 10
    },
    run: [
      {
        name: "print",
        arguments: {
          value: [
            "안녕 ${test_variable}"
          ]
        }
      }
    ]
  }
]

조금 길고 못생겼지만, 이렇게 쓴다.
이걸 JS코드로 변환을 하면

결과

// 처음 로그
const test_variable = `테스트 변수`
console.log(`안녕 ${test_variable}`);
for (let i = 0; i < 10; i++) {
  console.log(`안녕 ${test_variable}`);
}

이런식으로 변환이 되게된다.

변환을 시키는 코드는 내가 코딩을 잘 못하기 때문에,

변환 코드

async function jsonToJS(data, tab, run) {
    const result = []
    for await (const item of data) {
        result.push(realJsonToJS(item))
    }
    const code = beautify(result.join("\n"), { indent_size: tab, space_in_empty_paren: true })
    if (run) return eval(code)
    else return code
    function realJsonToJS(data) {
        const res = []
        switch (data.name) {
            case "print": {
                addCode(`console.log(${data.arguments.value.map(v => `\`${v}\``).join(", ")});`)
                break
            }
            case "loop": {
                addCode(`for (let ${data.arguments.variable} = ${data.arguments.start}; ${data.arguments.variable} < ${data.arguments.end}; ${data.arguments.variable}++) {`)
                for (const item of data.run) {
                    addCode(realJsonToJS(item))
                }
                addCode(`}`)
                break
            }
            case "memo": {
                addCode(`// ${data.value}`)
                break
            }
            case "variable": {
                addCode(`${data.type} ${data.id} = \`${data.value}\``)
                break
            }
        }
        function addCode(code) {
            res.push(/*`${new Array(tab * 4).fill(" ").join("")}*/`${code}`) 
        }
        return res.join("\n")
    }
}

이렇게 이루어져있다.

재귀함수를 이렇게 쓰는 것이 맞는거겠지?

마치며

나는 이걸 JSON뿐만이 아니라 XML로도 해보고싶다.
대충 생긴걸 구상을 해보면

<memo>처음 로그</memo>
<const name="test_variable">테스트 변수</const>
<print>
    <value>안녕 ${test_variable}</value>
</print>
<loop var="i" start="0" end="10">
    <print>
        <value>안녕 ${test_variable}</value>
    </print>
</loop>

이런 식으로 구상하고 있다.
아까의 JSON과 같은 기능을 하는 코드다.

코딩 잘 하고싶다.
profile
중학생 개발자 무식이

0개의 댓글