Releases: rycont/dalbit-yaksok
v2.2.2
What's Changed
- Brackte first parsing in index fetching by @rycont in #120
- ListLiteral와 IndexFetch 내 값은 다른 노드보다 우선하여 파싱됩니다
- Feat/disable entrypoint for base context 2 by @rycont in #121
- baseContext에는 executionDelay를 적용하지 않습니다
https://github.com/rycont/dalbit-yaksok/releases/tag/v2.2.2
https://jsr.io/@dalbit-yaksok/[email protected]
- ListLiteral와 IndexFetch 내 값은 다른 노드보다 우선하여 파싱됩니다. 이제 IndexFetch 노드의 인덱스가 복잡한 연산을 포함해도 제대로 파싱됩니다.
- codeFile.parseOptimistically 메소드가 추가되었습니다. 파싱에 실패하리라고 믿음직한 상황에서도 최선을 다해 파싱을 하려고 노력합니다. nodeToColors 함수와 궁합이 좋습니다.
- baseContext에는 executionDelay를 적용하지 않습니다
- baseContext에서는 runningCode를 보고하지 않습니다. 다음 버전에서는 롤백될 예정입니다. 다음 버전에서는 runningCode에서 scope를 함께 보고하기에, 이를 기준으로 현재 실행중인 파일이 맞는지 판단해주시길 바랍니다.
Full Changelog: v2.2.1...v2.2.2
v2.2.1
v2.1.0
What's Changed
- feat: Add '의 값 종류' operator for type checking by @rycont in #110
- (기능) 자바스크립트의 typeof 연산자와 동일한 역할을 하는
의 값 종류
표현이 추가되었습니다.
- (기능) 자바스크립트의 typeof 연산자와 동일한 역할을 하는
내_변수 = 10
내_변수 의 값 종류 보여주기 # 숫자
- Fix single-element array parsing: enable
R = [10]
syntax by @Copilot in #96- (버그 수정) 원소가 하나인 배열을 제대로 생성할 수 있습니다
Full Changelog: v2.0.0...v2.1.0
v2.0.0
https://jsr.io/@dalbit-yaksok/[email protected]
달빛약속 v2.0.0 릴리즈 노트
달빛약속 v2.0.0은 런타임 아키텍처가 크게 변경된 메이저 업데이트입니다. 이전 버전과 호환되지 않는 변경 사항이 있으니 마이그레이션 시 주의가 필요합니다.
Breaking Changes
-
Runtime
클래스 →YaksokSession
클래스로 대체-
기존의
yaksok()
함수와Runtime
클래스 대신,YaksokSession
을 생성하고 모듈을 관리하는 방식으로 변경되었습니다. -
이전 방식:
import { yaksok } from '@dalbit-yaksok/core' await yaksok('코드', { ... })
-
새로운 방식:
import { YaksokSession } from '@dalbit-yaksok/core' const session = new YaksokSession({ ... }) session.addModule('main', '코드') await session.runModule('main')
-
-
확장(Extension) 시스템 기반의 외부 함수 연동(FFI)
-
RuntimeConfig
의runFFI
설정이 제거되고,Extension
인터페이스를 통해 외부 런타임을 등록하는 방식으로 변경되었습니다. -
예제:
import { YaksokSession, Extension, ValueType, NumberValue, } from '@dalbit-yaksok/core' // 1. 외부 기능을 제공할 Extension을 정의합니다. class SystemExtension implements Extension { manifest = { ffiRunner: { runtimeName: 'System' }, } executeFFI(code: string): ValueType { if (code.trim() === 'time') { return new NumberValue(Date.now()) } throw new Error('알 수 없는 기능입니다.') } } // 2. 세션에 Extension을 등록합니다. const session = new YaksokSession() await session.extend(new SystemExtension()) // 3. 약속 코드에서 `번역` 문법으로 사용합니다. session.addModule( 'main', ` 번역(System), 현재 시간 *** time *** "현재 유닉스 타임스탬프: " + (현재 시간) 보여주기 `, ) await session.runModule('main')
-
-
Base Context in Session
-
session.setBaseContext()
를 사용하여 여러 코드 실행 간에 함수와 변수를 공유하고 재사용할 수 있습니다. (예: REPL, 내장 라이브러리 구현) -
기존의
CodeFile
기반 Base Context는 이용할 수 없습니다. -
예제:
import { YaksokSession } from '@dalbit-yaksok/core' const session = new YaksokSession() // 1. 여러 모듈에서 공통으로 사용할 함수가 담긴 코드를 준비합니다. const baseCode = ` 약속, (값)에 느낌표 붙이기 값 + "!" 반환하기 ` // 2. setBaseContext로 기본 문맥을 설정합니다. await session.setBaseContext(baseCode) // 3. 이제 다른 모듈에서 baseCode에 정의된 함수를 바로 사용할 수 있습니다. session.addModule( 'main', ` "안녕"에 느낌표 붙이기 보여주기 `, ) await session.runModule('main') // "안녕!"이 출력됩니다.
-
신규 기능
-
실행 취소 기능 추가
-
AbortSignal
을 세션에 전달하여 코드 실행을 중간에 안전하게 중단시킬 수 있습니다. -
예제:
import { YaksokSession } from '@dalbit-yaksok/core' const controller = new AbortController() const session = new YaksokSession({ // AbortController의 signal을 세션에 전달합니다. signal: controller.signal, // 무한 루프가 유효성 검사를 통과하도록 플래그를 설정합니다. flags: { 'skip-validate-break-or-return-in-loop': true, }, }) session.addModule( 'main', ` 반복 "멈추지 않는 기차" 보여주기 `, ) // 0.1초 후에 실행을 중단시킵니다. setTimeout(() => controller.abort(), 100) const result = await session.runModule('main') console.log(result.reason) // 'aborted'
-
-
반복
구문 유효성 검사 비활성화 플래그 추가skip-validate-break-or-return-in-loop
플래그를 통해반복
구문 내에반복 그만
등의 탈출 코드가 없어도 오류가 발생하지 않도록 설정할 수 있습니다.
기타 개선 사항
-
executionDelay
동작 변경- 이제
executionDelay
는runModule()
로 직접 실행한 메인 모듈에만 적용됩니다. 불러온 다른 모듈 내부의 코드는 지연 없이 실행되어, 디버깅 경험이 향상되었습니다.
- 이제
-
유효성 검사 강화
- 동일한 이름으로 함수를 중복 정의하는 것을 방지하고, 외부 함수(FFI) 실행 및 모듈 로딩 과정에서 발생하는 오류를 더 상세하게 표시하도록 개선되었습니다.
v1.2.0
v1.1.2
v1.1.1
청소년_나이_경계 = [15, 24]
약속, (나이)살은 청소년인지
(청소년_나이_경계[0] <= 나이) 이고 (나이 <= 청소년_나이_경계[1]) 반환하기
약속, (이름)에게 반갑게 인사하기
만약 이름 == "폴" 이면
"저 폴이랑 안 친해요" 보여주기
약속 그만 # 또는 반환하기
"안녕, " + 이름 + "!" 보여주기
20살은 청소년인지 보여주기
"폴"에게 반갑게 인사하기
"재이"에게 반갑게 인사하기
10 != 20 보여주기
!(10 == 20) 보여주기
What's Changed
- 리스트의 시작은 0입니다.
==
로 동등비교 연산자를 사용합니다=
로 변수에 값을 할당합니다!=
연산자(NotEqual)가 추가되었습니다!
표현식(Not)이 추가되었습니다반환하기
키워드로 약속을 종료하고 값을 반환합니다
Miscs
Full Changelog: v0.2.1...v1.1.1
v0.2.1
What's Changed
현재 실행중인 코드의 위치를 알 수 있는 기능이 추가되었습니다. 이를 활용하여 코드 실행 흐름 시각화 기능을 구현할 수 있습니다.
- 문서: https://dalbit-yaksok.postica.app/library/5.%20%ED%98%84%EC%9E%AC%20%EC%8B%A4%ED%96%89%EC%A4%91%EC%9D%B8%20%EC%BD%94%EB%93%9C%EC%9D%98%20%EC%9C%84%EC%B9%98%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0.html
- PR: feat: Slow running & Running Codes by @rycont in #78
Full Changelog: v0.2.0...v0.2.1
v0.2.0
기능 개선 / 변경
- 다른 파일에 있는 약속을 읽어오는 중에 발생한 오류도 예쁘게 보여줍니다 / fix: make errors(raised during loading exportedRule) wrapped in ErrorsInModule by @rycont in #49
- FFI(번역)에서 Async 함수를 지원합니다 / Support async ffi 0.2.x by @rycont in #56
- 오류 메시지에서 토큰 이름을 사용자에게 친근한 단어로 변환하여 보여줍니다 / Feat: Make token type readable in error message by @rycont in #57
- Monaco Editor를 위한 언어 확장 패키지가 추가되었습니다 / feat: implement monaco language provider by @rycont in #63
- 오류를 발생한 달빛약속 코드에 밑줄을 그어서 오류메시지를 보여줍니다 / feat: implement regional error token accent by @rycont in #68
- 문자열 내에 줄바꿈이 있는 경우 오류를 발생합니다 / Fix: raise error when newline in string by @rycont in #77
해결된 오류
- 함수의 인자로 Identifier(변수)만 전달되어도 정상적으로 파싱됩니다 / Fix identifier as parameter parse error by @rycont in #44
- 소수를 파싱할 수 있습니다 / fix: update number tokenizer rule starter regex and validation logic by @rycont in #64
- 함수 이름에 예약어가 포함되면 오류를 냅니다 / feat: block declaring function header containing reserved words by @rycont in #66
- 범위 연산자(~)에 정수가 아닌 수가 입력되었을 때 올바르게 처리합니다 / Fix: range operator to handle non-integer numbers by @rycont in #70
- 유사한 함수 이름을 잘 구분하여 파싱합니다 / Fix similar function header parsing error by @rycont in #75
- 한 글자짜리 함수도 잘 파싱합니다 / Call corresponding function if
NotDefinedIdentifier
error raised by @rycont in #76
구조 개선
- Refactor: separate tokenizer and nodes by @rycont in #48
- feat: implement FunctionObject and separated from DeclareFunction node by @rycont in #50
- Separate value and literal by @rycont in #51
- Get quickjs binary from unpkg 0.2.x by @rycont in #53
- Chore: add quickjs dry deploy in test by @rycont in #58
- docs: apply changed name to docs by @rycont in #59
- feat: optimistic tokenizer by @rycont in #60
- Refactor docs(Vitepress) & test to use Deno Workspace by @rycont in #61
- Unified version applier by @rycont in #62
- Update test coverage by @rycont in #67
- refactor: remove all callFrame usage by @rycont in #71
- chore: bump package versions to 0.2.0-RC.5 by @rycont in #72
- chore: remove monaco editor import in language provider by @rycont in #73
- feat: RULE_FLAGS.IS_STATEMENT by @rycont in #74
Full Changelog: v0.1.19...v0.2.0
v0.2.0-RC.9
What's Changed
- Call corresponding function if
NotDefinedIdentifier
error raised by @rycont in #76- 한 단어로 된 함수도 올바르게 실행될 수 있습니다.
Full Changelog: v0.2.0-RC.8...v0.2.0-RC.9