Skip to main content

OpenUI Lang — 내장 기능 사용 사례 22개

이 문서는 OpenUI Lang 1.0.1 런타임의 내장 기능을 독립적으로 설명한다. 사용자 정의 함수·액션을 등록하는 문서와 구분하며, 프로젝트 파일·다른 문서·로컬 서버를 열지 않아도 계약과 예제를 읽을 수 있다. 전체 22개 항목에 44개 예제를 제공한다. 라이브러리 버전이 다르면 계약과 지원 범위를 확인해야 한다.

기능의 종류​

구분개수실행 방식표기
내장 계산 함수14표현식을 평가할 때 값을 계산@Count(...), @Each(...) 등
내장 이벤트 액션5버튼 등 이벤트가 발생할 때 동작 수행@Set, @Reset, @Run, @ToAssistant, @OpenUrl
액션 조합1여러 액션을 순서대로 실행Action([...]) — @ 없음
도구 예약 구문2조회 또는 변경 작업을 선언Query(...), Mutation(...) — @ 없음

이 항목들은 모두 사용자 정의 함수가 아니다. 특히 Query와 Mutation은 최상위 선언용 예약 구문이며, Action은 액션들을 묶는 구문이다. 이름 앞에 무조건 @를 붙이면 안 된다.

문법과 보조 컴포넌트​

  • root = ...는 화면 진입점이다. root에서 참조한 요소들이 표시된다.
  • $count = 0은 상태 변수와 초깃값 선언이다. 초깃값은 literal을 사용한다.
  • result = @Sum([1,2,3])은 계산 표현식이다. result를 화면에서 사용하면 6을 표시한다.
  • 함수 인자는 위치 기반이다. 중간 선택 인자를 건너뛸 때는 계약에 맞춰 null을 사용한다.
  • 조건 ? 참일때값 : 거짓일때값은 조건 표현식이다.
  • 객체 키는 {"name":"A"}처럼 따옴표로 감싼다.
  • root가 아래 줄에 선언된 상태·데이터를 참조할 수 있다. 참조된 변수는 모두 선언해야 한다.
보조 요소계약과 역할
Col(children, gap?, align?)콘텐츠를 세로로 배치한다.
Text(text)문자열을 표시한다. 숫자·불리언은 "결과: " + value처럼 문자열로 바꿀 수 있다.
Table(columns, rows)열 제목 배열과 행별 셀 배열로 표를 표시한다.
Button(label, action)클릭 시 액션을 실행한다.
Input($value, label?, type?)문자열 또는 숫자를 상태에 바인딩한다. type은 text 또는 number다.
Checkbox($checked, label)불리언 상태를 바꾼다.
Form(children)입력을 묶고 ToAssistant 요청에 폼 값을 함께 전달한다.

Markdown은 코드를 표시하는 문서 형식이다. 실행하려면 이 문서의 계약을 지원하는 OpenUI 파서·평가기·렌더러와 보조 컴포넌트를 등록한 호스트 애플리케이션이 필요하다. 내장 함수·액션을 사용하려고 별도 사용자 정의 함수 배열에 다시 등록할 필요는 없다.

값 계산과 이벤트 실행의 차이​

root = Col([Button("증가", @Set($count, $count + 1)), Text("횟수: " + $count)])
$count = 0

처음에는 count=0을 읽어 Text를 표시하고 버튼의 액션을 준비한다. 이때 Set을 즉시 실행하지 않는다. 버튼을 누르면 $count + 1을 클릭 시점의 값으로 계산하고 Set이 새 값을 저장한다. 상태를 읽는 Text가 재평가돼 1을 표시한다. 이후 클릭마다 같은 순서를 반복한다.

계산 함수도 액션 안에 놓일 수 있다. @Set($result, @Sum([1,2,3]))이면 클릭할 때 Sum을 계산해 6을 저장한다. 반면 result = @Sum([1,2,3])은 화면에 필요한 표현식을 평가할 때 계산한다. 계산 함수의 종류와 실행 시점은 구별해야 한다.

내장 계산·상태 변경은 브라우저 런타임에서 수행할 수 있다. ToAssistant·OpenUrl은 이벤트를 받은 호스트의 처리가 필요하고, Query·Mutation·Run은 도구 제공자가 필요하다. 문법이 내장돼 있다는 것이 모델·네트워크·업무 API까지 자동 연결됐다는 뜻은 아니다.

Query·Mutation 예제에 필요한 독립 데모 도구​

아래 예제의 read_demo·write_demo는 OpenUI에 내장된 도구 이름이 아니다. 이 문서가 정의하는 메모리 전용 데모 도구다. Query·Mutation·Run 예제를 실행하려는 호스트는 다음 함수 맵을 렌더러의 toolProvider에 전달한다. 도구 이름을 DSL에서 적는 것만으로 실제 API가 만들어지지 않는다.

function createDemoTools() {
let value = 0;
let calls = 0;
return {
read_demo: async (args) => {
const factor = typeof args.factor === "number" ? args.factor : 1;
return {
value,
calls: ++calls,
rows: [
{ name: "A", value: 10 * factor },
{ name: "B", value: 20 * factor }
]
};
},
write_demo: async (args) => {
if (typeof args.value !== "number" || !Number.isFinite(args.value)) {
throw new Error("value must be a finite number");
}
value = args.value;
return { value };
}
};
}

const tools = createDemoTools();
// 호스트는 이 함수 맵을 Renderer의 toolProvider 속성에 연결한다.
// 한 예제를 실행하는 동안 같은 tools 인스턴스를 유지한다.

도구 인스턴스마다 value와 calls가 독립적이다. 초깃값은 0이며, read_demo 호출마다 calls가 증가한다. write_demo는 메모리 값만 바꾸며 DB·localStorage·외부 서버를 사용하지 않는다. 새 인스턴스를 만들면 초기화된다. 실제 제품에서는 동일한 인터페이스를 업무 API 등에 연결할 수 있다.

전체 목차​

  • Count — 값 계산 · 목록의 항목 수를 셉니다.
  • First — 값 계산 · 첫 항목을 반환하고 빈 목록이면 null입니다.
  • Last — 값 계산 · 마지막 항목을 반환하고 빈 목록이면 null입니다.
  • Sum — 값 계산 · 숫자 목록의 합계를 구합니다.
  • Avg — 값 계산 · 숫자 목록의 평균을 구합니다.
  • Min — 값 계산 · 숫자 목록의 최솟값을 구합니다.
  • Max — 값 계산 · 숫자 목록의 최댓값을 구합니다.
  • Round — 값 계산 · 지정한 소수 자릿수에서 반올림합니다.
  • Abs — 값 계산 · 절댓값을 구합니다.
  • Floor — 값 계산 · 가장 가까운 작은 정수로 내립니다.
  • Ceil — 값 계산 · 가장 가까운 큰 정수로 올립니다.
  • Sort — 값 계산 · 필드 또는 항목 자체를 기준으로 정렬한 사본을 반환합니다.
  • Filter — 값 계산 · 조건을 만족하는 항목만 선택합니다. 빈 field는 항목 자체를 비교합니다.
  • Each — 값 계산 · 목록의 각 항목에 대해 인라인 템플릿을 평가합니다. 반복 변수는 템플릿 안에서만 유효합니다.
  • Set — 이벤트 액션 · 상태 변수에 새 값을 저장합니다. value 계산은 클릭 시점에 수행합니다.
  • Reset — 이벤트 액션 · 지정한 상태를 선언된 초깃값으로 되돌립니다.
  • Action — 이벤트 액션 · 여러 액션을 순서대로 묶습니다. Action은 @ 없이 작성합니다.
  • ToAssistant — 이벤트 액션 · 호스트로 후속 대화 이벤트와 선택적 맥락을 전달합니다. 실제 대화 처리는 호스트가 담당합니다.
  • OpenUrl — 이벤트 액션 · 호스트로 URL 열기 이벤트를 전달합니다. 호스트가 주소 열기 방식을 결정합니다.
  • Query — 예약 구문 · 등록된 조회 도구를 자동 호출합니다. @가 없는 최상위 선언이며 입력 상태에 따라 재조회할 수 있습니다.
  • Mutation — 예약 구문 · 변경 도구를 선언하며 @Run으로 실행할 때만 호출합니다. 인자는 클릭 시점의 상태로 평가합니다.
  • Run — 이벤트 액션 · 선언된 Query를 재조회하거나 Mutation을 실행합니다. 임의의 함수 호출 참조는 대상이 아닙니다.

Count​

값 계산 · 목록의 항목 수를 셉니다.

호출 계약

Count(array: any[]) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

3 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Count(["A","B","C"])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Count([])

First​

값 계산 · 첫 항목을 반환하고 빈 목록이면 null입니다.

호출 계약

First(array: any[]) → any

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

A / null

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @First(["A","B","C"])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @First([])

Last​

값 계산 · 마지막 항목을 반환하고 빈 목록이면 null입니다.

호출 계약

Last(array: any[]) → any

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

C / null

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Last(["A","B","C"])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Last([])

Sum​

값 계산 · 숫자 목록의 합계를 구합니다.

호출 계약

Sum(numbers: number[]) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

60 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Sum([10,20,30])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Sum([])

Avg​

값 계산 · 숫자 목록의 평균을 구합니다.

호출 계약

Avg(numbers: number[]) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

20 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Avg([10,20,30])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Avg([])

Min​

값 계산 · 숫자 목록의 최솟값을 구합니다.

호출 계약

Min(numbers: number[]) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

-5 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Min([10,-5,30])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Min([])

Max​

값 계산 · 숫자 목록의 최댓값을 구합니다.

호출 계약

Max(numbers: number[]) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

30 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Max([10,-5,30])

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Max([])

Round​

값 계산 · 지정한 소수 자릿수에서 반올림합니다.

호출 계약

Round(number: number, decimals?: number) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

12.35 / 130

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Round(12.345, 2)

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Round(125, -1)

Abs​

값 계산 · 절댓값을 구합니다.

호출 계약

Abs(number: number) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

7 / 0

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Abs(-7)

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Abs(0)

Floor​

값 계산 · 가장 가까운 작은 정수로 내립니다.

호출 계약

Floor(number: number) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

3 / -4

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Floor(3.9)

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Floor(-3.1)

Ceil​

값 계산 · 가장 가까운 큰 정수로 올립니다.

호출 계약

Ceil(number: number) → number

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

4 / -3

예제 1. 기본 계산​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Ceil(3.1)

예제 2. 다른 입력 / 빈 목록​

root = Col([Text(result == null ? "null" : "결과: " + result)])
result = @Ceil(-3.9)

Sort​

값 계산 · 필드 또는 항목 자체를 기준으로 정렬한 사본을 반환합니다.

호출 계약

Sort(array: any[], field: string, direction?: "asc" | "desc") → any[]

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

기대 결과

[1,2,3] / B(30), A(10)

예제 1. 숫자 오름차순​

root = Col([Table(["정렬 결과"], @Each(result, "r", [r]))])
result = @Sort([3,1,2], "", "asc")

예제 2. 필드 내림차순​

root = Col([Table(["이름", "점수"], @Each(result, "r", [r.name, r.score]))])
result = @Sort([{"name":"A","score":10},{"name":"B","score":30}], "score", "desc")

Filter​

값 계산 · 조건을 만족하는 항목만 선택합니다. 빈 field는 항목 자체를 비교합니다.

호출 계약

Filter(array: any[], field: string, operator: "==" | "!=" | ">" | "<" | ">=" | "<=" | "contains", value: any) → any[]

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

연산자는 ==, !=, >, <, >=, <=, contains다. 빈 필드명은 항목 자체를, 점 경로는 중첩 필드를 읽는다. 이 버전의 ==/!=는 느슨한 비교이며 수치 비교에는 숫자 변환이 적용되므로 타입이 중요한 데이터는 입력을 먼저 정규화한다. contains는 문자열 포함 여부이며 대소문자를 구분한다.

기대 결과

[20,30] / Apple

예제 1. 숫자 범위​

root = Col([Table(["선택 결과"], @Each(result, "r", [r]))])
result = @Filter([10,20,30], "", ">=", 20)

예제 2. 문자 포함​

root = Col([Table(["이름"], @Each(result, "r", [r.name]))])
result = @Filter([{"name":"Apple"},{"name":"Banana"}], "name", "contains", "App")

Each​

값 계산 · 목록의 각 항목에 대해 인라인 템플릿을 평가합니다. 반복 변수는 템플릿 안에서만 유효합니다.

호출 계약

Each(array: any[], varName: string, template: expression) → any[]

표현식 평가 시 계산합니다. 입력과 참조 상태가 바뀌면 다시 계산할 수 있습니다.

반복 변수는 인라인 템플릿 안에서만 사용한다. itemText = Text(item)을 별도 전역 선언으로 분리하면 item의 범위를 벗어난다. Each는 템플릿을 항목마다 평가하는 지연 평가 기능이므로 일반 함수와 인자 평가 방식이 다르다.

기대 결과

[2,4,6] / 사과·배·우유 Text 세 개

예제 1. 계산 목록​

root = Col([Table(["두 배"], @Each(result, "r", [r]))])
result = @Each([1,2,3], "n", n * 2)

예제 2. 컴포넌트 반복​

root = Col(@Each(["사과","배","우유"], "item", Text(item)))

Set​

이벤트 액션 · 상태 변수에 새 값을 저장합니다. value 계산은 클릭 시점에 수행합니다.

호출 계약

Set(variable: $variable, value: expression)

클릭 이벤트에서 실행합니다. 화면을 그리는 것만으로 액션을 실행하지 않습니다.

기대 결과

클릭마다 0→1→2 / null→결과: B

예제 1. 카운터 증가​

root = Col([Button("증가", @Set($count, $count + 1)), Text("횟수: " + $count)])
$count = 0

예제 2. 문자열 상태 변경​

root = Col([Button("선택", @Set($result, "B")), Text($result == null ? "null" : "결과: " + $result)])
$result = null

Reset​

이벤트 액션 · 지정한 상태를 선언된 초깃값으로 되돌립니다.

호출 계약

Reset(...variables: $variable[])

클릭 이벤트에서 실행합니다. 화면을 그리는 것만으로 액션을 실행하지 않습니다.

Reset은 무조건 0이나 빈 문자열로 바꾸는 기능이 아니다. 원래 선언한 초깃값으로 복원한다. 변수 여러 개를 전달하면 각각 복원한다.

기대 결과

수량을 바꾼 뒤 복원하면 3 / 이름 도도·완료 false 복원

예제 1. 한 상태 초기화​

root = Col([Input($count, "수량", "number"), Button("기본값 복원", @Reset($count)), Text("수량: " + $count)])
$count = 3

예제 2. 여러 상태 초기화​

root = Col([Input($name, "이름"), Checkbox($done, "완료"), Button("전체 복원", @Reset($name, $done))])
$name = "도도"
$done = false

Action​

이벤트 액션 · 여러 액션을 순서대로 묶습니다. Action은 @ 없이 작성합니다.

호출 계약

Action(steps: ActionExpression[])

클릭 이벤트에서 실행합니다. 화면을 그리는 것만으로 액션을 실행하지 않습니다.

Action은 @ 없이 작성한다. 각 Set은 실행 순서에 따라 최신 상태를 읽는다. 첫 예제의 두 번째 Set은 증가된 count를 읽으므로 첫 클릭에서 result=10이다. 전체 동작을 하나의 원자적 트랜잭션으로 보장하는 구문은 아니다.

기대 결과

첫 클릭 count=1, result=10 / 입력값을 saved로 옮기고 초안을 초깃값으로 복원

예제 1. 순서대로 상태 변경​

root = Col([Button("두 단계 실행", Action([@Set($count, $count + 1), @Set($result, $count * 10)])), Text("count: " + $count), Text("result: " + $result)])
$count = 0
$result = 0

예제 2. 변경과 초기화​

root = Col([Input($text, "초안"), Button("확정", Action([@Set($saved, $text), @Reset($text)])), Text("저장한 값: " + $saved)])
$text = "안녕하세요"
$saved = ""

ToAssistant​

이벤트 액션 · 호스트로 후속 대화 이벤트와 선택적 맥락을 전달합니다. 실제 대화 처리는 호스트가 담당합니다.

호출 계약

ToAssistant(message: string, context?: any)

클릭 이벤트에서 실행합니다. 화면을 그리는 것만으로 액션을 실행하지 않습니다.

호스트 이벤트의 type은 continue_conversation이며 요청 문장·선택적 context·폼 상태를 전달할 수 있다. 호스트가 실제 모델 호출에 연결할 수도 있고, 학습용 화면처럼 이벤트만 표시할 수도 있다.

기대 결과

호스트에 요청 문장 전달 / 요청·맥락·폼 값 전달. 실제 모델 호출 여부는 호스트가 결정

예제 1. 후속 질문​

root = Col([Button("자세히 설명", @ToAssistant("이 내용을 자세히 설명해줘"))])

예제 2. 폼과 맥락​

root = Col([Form([Input($name, "이름"), Button("계속", @ToAssistant("이 이름으로 인사해줘", {"source":"builtin-demo"}))])])
$name = "도도"

OpenUrl​

이벤트 액션 · 호스트로 URL 열기 이벤트를 전달합니다. 호스트가 주소 열기 방식을 결정합니다.

호출 계약

OpenUrl(url: string)

클릭 이벤트에서 실행합니다. 화면을 그리는 것만으로 액션을 실행하지 않습니다.

호스트 이벤트의 type은 open_url이다. URL을 실제로 여는 책임은 호스트에 있다. 예제의 사이트를 여는 동작은 사용자 클릭에서 발생하며 네트워크 연결이 필요하다.

기대 결과

호스트가 URL 이벤트를 처리하면 지정한 사이트 열기

예제 1. 예시 사이트 열기​

root = Col([Button("예시 사이트", @OpenUrl("https://example.com"))])

예제 2. 다른 주소 열기​

root = Col([Button("OpenUI 사이트", @OpenUrl("https://www.openui.com"))])

Query​

예약 구문 · 등록된 조회 도구를 자동 호출합니다. @가 없는 최상위 선언이며 입력 상태에 따라 재조회할 수 있습니다.

호출 계약

data = Query(toolName: string, args: object, defaults: object, refreshIntervalSeconds?: number)

예약 구문은 최상위에서 일반 변수에 할당한다. 이 문서의 메모리 도구를 사용하는 예제이며, 사용자 정의 함수 호출과 구분한다.

세 번째 인자는 초기 조회 전 사용할 기본 결과다. 네 번째 선택 인자는 자동 갱신 주기(초)다. 조회 인자에 상태를 넣으면 상태가 바뀔 때 결과를 갱신할 수 있다. Query 변수는 $data가 아닌 data다. 조회 횟수는 재조회·마운트 방식에 따라 달라질 수 있으므로 횟수 자체보다 증가 여부를 관찰한다.

기대 결과

A=10,B=20 및 호출 횟수 / factor 2이면 A=20,B=40

예제 1. 자동 조회​

root = Col([Text("호출 횟수: " + data.calls), Table(["이름","값"], @Each(data.rows, "r", [r.name,r.value]))])
data = Query("read_demo", {}, {"value":0,"calls":0,"rows":[]})

예제 2. 입력에 따른 재조회​

root = Col([Input($factor, "배수", "number"), Text("호출 횟수: " + data.calls), Table(["이름","값"], @Each(data.rows, "r", [r.name,r.value]))])
$factor = 1
data = Query("read_demo", {"factor":$factor}, {"value":0,"calls":0,"rows":[]})

Mutation​

예약 구문 · 변경 도구를 선언하며 @Run으로 실행할 때만 호출합니다. 인자는 클릭 시점의 상태로 평가합니다.

호출 계약

saved = Mutation(toolName: string, args: object)

예약 구문은 최상위에서 일반 변수에 할당한다. 이 문서의 메모리 도구를 사용하는 예제이며, 사용자 정의 함수 호출과 구분한다.

선언만으로 변경 요청을 실행하지 않는다. @Run(saved)가 발생할 때 현재 상태로 인자를 계산한다. saved.status는 idle/loading/success/error이며 성공 데이터는 saved.data, 오류는 saved.error로 확인한다. 변경 후 기존 Query를 새로 읽으려면 Action([@Run(saved), @Run(data)])처럼 명시한다.

기대 결과

idle→success 및 저장값 42 / 저장 후 현재 값 7

예제 1. 값 저장​

root = Col([Input($value, "저장할 값", "number"), Button("저장", @Run(saved)), Text("상태: " + saved.status), Text(saved.status == "success" ? "저장값: " + saved.data.value : "아직 저장하지 않음")])
$value = 42
saved = Mutation("write_demo", {"value":$value})

예제 2. 저장 후 조회 갱신​

root = Col([Input($value, "새 값", "number"), Button("저장·조회", Action([@Run(saved), @Run(data)])), Text("현재 값: " + data.value), Text("저장 상태: " + saved.status)])
$value = 7
data = Query("read_demo", {}, {"value":0,"calls":0,"rows":[]})
saved = Mutation("write_demo", {"value":$value})

Run​

이벤트 액션 · 선언된 Query를 재조회하거나 Mutation을 실행합니다. 임의의 함수 호출 참조는 대상이 아닙니다.

호출 계약

Run(ref: Query | Mutation)

이벤트에서 실행하며 Query 또는 Mutation의 선언 변수를 참조한다. 실제 작업에는 앞서 정의한 도구 제공자가 필요하다.

기대 결과

클릭 후 조회 횟수 증가 / 클릭 후 저장 상태 success·값 99

예제 1. Query 수동 재조회​

root = Col([Text("조회 횟수: " + data.calls), Button("다시 조회", @Run(data))])
data = Query("read_demo", {}, {"value":0,"calls":0,"rows":[]})

예제 2. Mutation 실행​

root = Col([Button("99 저장", @Run(saved)), Text("상태: " + saved.status), Text(saved.status == "success" ? "저장값: " + saved.data.value : "대기")])
saved = Mutation("write_demo", {"value":99})

문제를 확인하는 순서​

  1. 함수·액션·예약 구문 중 어느 종류인지 확인한다. Action·Query·Mutation 앞에는 @를 붙이지 않는다.
  2. 계산식이 root의 화면이나 버튼 액션에 실제 연결됐는지 확인한다.
  3. 상태 이름에 $가 붙었는지, 기본값이 선언됐는지 확인한다.
  4. Each 반복 변수는 인라인 템플릿 안에서만 사용한다.
  5. Query·Mutation의 도구 이름과 인자·응답 구조가 호스트 제공자와 일치하는지 확인한다.
  6. ToAssistant·OpenUrl은 이벤트 수신만으로 동작이 끝나는지, 실제 후속 동작까지 호스트가 구현했는지 확인한다.

사용자 정의 함수에 붙인 로그가 내장 기능에도 자동 적용되지는 않는다. 상태 변경은 화면의 값, 계산은 기대 결과, 도구 호출은 반환한 calls·status·data 등으로 확인한다. 런타임 오류를 확인하는 UI나 로그는 호스트가 제공한다.