Skip to content

Releases: rycont/dalbit-yaksok

v2.2.2

18 Jul 16:02
d048934
Compare
Choose a tag to compare

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

17 Jul 15:33
d7d0c04
Compare
Choose a tag to compare

What's Changed

  • Update validation logic and bump package versions to 2.2.1 by @rycont in #116
    • 변수 할당 구문의 할당 값(SetVariable.value)도 유효성 검사를 수행합니다

Full Changelog: v2.2.0...v2.2.1

v2.1.0

14 Jul 15:38
63a415d
Compare
Choose a tag to compare

What's Changed

  • feat: Add '의 값 종류' operator for type checking by @rycont in #110
    • (기능) 자바스크립트의 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

12 Jul 16:07
Compare
Choose a tag to compare

https://jsr.io/@dalbit-yaksok/[email protected]

달빛약속 v2.0.0 릴리즈 노트

달빛약속 v2.0.0은 런타임 아키텍처가 크게 변경된 메이저 업데이트입니다. 이전 버전과 호환되지 않는 변경 사항이 있으니 마이그레이션 시 주의가 필요합니다.

Breaking Changes

  1. 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')
  2. 확장(Extension) 시스템 기반의 외부 함수 연동(FFI)

    • RuntimeConfigrunFFI 설정이 제거되고, 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')
  3. 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') // "안녕!"이 출력됩니다.

신규 기능

  1. 실행 취소 기능 추가

    • 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'
  2. 반복 구문 유효성 검사 비활성화 플래그 추가

    • skip-validate-break-or-return-in-loop 플래그를 통해 반복 구문 내에 반복 그만 등의 탈출 코드가 없어도 오류가 발생하지 않도록 설정할 수 있습니다.

기타 개선 사항

  1. executionDelay 동작 변경

    • 이제 executionDelayrunModule()로 직접 실행한 메인 모듈에만 적용됩니다. 불러온 다른 모듈 내부의 코드는 지연 없이 실행되어, 디버깅 경험이 향상되었습니다.
  2. 유효성 검사 강화

    • 동일한 이름으로 함수를 중복 정의하는 것을 방지하고, 외부 함수(FFI) 실행 및 모듈 로딩 과정에서 발생하는 오류를 더 상세하게 표시하도록 개선되었습니다.

v1.2.0

10 Apr 14:48
3738b6d
Compare
Choose a tag to compare

What's Changed

  • Implement baseContext by @rycont in #86
    • Base Context 기능이 추가되었습니다. 자세한 내용은 문서에서 확인하실 수 있습니다.

Full Changelog: v1.1.2...v1.2.0

v1.1.2

05 Apr 03:46
17947f2
Compare
Choose a tag to compare

What's Changed

  • Multiple function with branching name by @rycont in #85
    • 이름이 변형이 포함되는 함수(약속 / 번역)를 여러개 선언할 수 없던 오류를 해결했습니다.

Full Changelog: v1.1.1...v1.1.2

v1.1.1

16 Mar 05:30
053ad9e
Compare
Choose a tag to compare
청소년_나이_경계 = [15, 24]

약속, (나이)살은 청소년인지
    (청소년_나이_경계[0] <= 나이) 이고 (나이 <= 청소년_나이_경계[1]) 반환하기

약속, (이름)에게 반갑게 인사하기
    만약 이름 == "" 이면
        "저 폴이랑 안 친해요" 보여주기
        약속 그만 # 또는 반환하기
    "안녕, " + 이름 + "!" 보여주기

20살은 청소년인지 보여주기
""에게 반갑게 인사하기
"재이"에게 반갑게 인사하기

10 != 20 보여주기
!(10 == 20) 보여주기

What's Changed

  • 리스트의 시작은 0입니다.
  • ==로 동등비교 연산자를 사용합니다
  • =로 변수에 값을 할당합니다
    • Zerobase Indexing, Equality Operator with Double Equal SIgn, Variable Assigning with Single Equal Sign by @rycont in #80
  • != 연산자(NotEqual)가 추가되었습니다
  • ! 표현식(Not)이 추가되었습니다
    • NotEqual Operator(!=) & Not Expression(!) by @rycont in #83
  • 반환하기 키워드로 약속을 종료하고 값을 반환합니다
    • 이제 결과: 변수의 값은 약속의 실행 결과값으로 사용되지 않습니다
    • 약속 그만 키워드는 기존과 동일하게 사용됩니다
    • New return syntax by @rycont in #82

Miscs

  • fix(monaco-language-provider): change TOKEN_TYPE.COLON to TOKEN_TYPE.ASSIGNMENT by @rycont in #81

Full Changelog: v0.2.1...v1.1.1

v0.2.1

14 Mar 11:58
74e4619
Compare
Choose a tag to compare

What's Changed

현재 실행중인 코드의 위치를 알 수 있는 기능이 추가되었습니다. 이를 활용하여 코드 실행 흐름 시각화 기능을 구현할 수 있습니다.

Full Changelog: v0.2.0...v0.2.1

v0.2.0

08 Mar 00:10
2127578
Compare
Choose a tag to compare

기능 개선 / 변경

  • 다른 파일에 있는 약속을 읽어오는 중에 발생한 오류도 예쁘게 보여줍니다 / 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

26 Jan 07:43
be4641b
Compare
Choose a tag to compare
v0.2.0-RC.9 Pre-release
Pre-release

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