# 특수 노드

커맨드의 파라미터로 사용할 수 있는 특수 노드들입니다. 특수 노드 예제는 여기서 (opens new window) 볼 수 있습니다.

# FunctionNode

FunctionNode를 사용해 함수 타입의 값을 파라미터로 사용할 수 있습니다. ToasterExecuteFunction 메서드로 함수를 실행할 수 있습니다.

ToastCommand.CreateAction<ToastContext, int, FunctionNode>("repeat", (ctx, x, y) => {
    for (int i = 0; i < x; i++) {
        ctx.Toaster.ExecuteFunction(y, new object[] { i }, ctx);
    }
})
> repeat 5 (x){ print x }
0
1
2
3
4

# CommandNode

CommandNode를 커맨드의 파라미터로 사용하면 파싱된 노드를 실행 전에 가져와 사용할 수 있습니다. 커맨드 노드를 사용하면 삼항 연산자를 만들거나 복잡한 커맨드의 가독성을 높일 수 있습니다.

ToastCommand.CreateFunc<ToastContext, bool, object, object>("if", (ctx, x, y) => x ? y : null)
ToastCommand.CreateFunc<CommandNode, ToastContext, object, object>("else", (x, ctx, y) => {
    if (x.Command.Name != "if") {
        throw new Exception();
    }

    if ((bool)ctx.Toaster.ExecuteNode(x.Parameters[0])) {
        return ctx.Toaster.ExecuteNode(x.Parameters[1]);
    }
    else {
        return y;
    }
})
> if true 1
1
> if false 1

> if true 1 else 2
1
> if false 1 else 2
2

# VariableNode

파라미터가 한 개도 없는 커맨드는 변수 노드로 취급됩니다. 변수 노드는 키워드, 속성이나 enum 등으로 사용할 수 있습니다.

ToastCommand.CreateFunc<VariableNode, ToastContext, object, string>("of", (x, ctx, y) => {
    if (x.Name == "type") {
        return y.GetType().Name;
    }
    else {
        throw new Exception();
    }
})
> type of "string"
String