나는 최근에 난해한 프로그래밍 언어를 보고 무언가를 생각했다.
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과 같은 기능을 하는 코드다.