Skip to content

6. 함수와 변수 재사용하기(Base Context)

Base Context는 약속 코드의 실행 결과를 저장하고 재사용할 수 있는 기능입니다. 이를 활용하면 함수와 변수를 다른 소스 코드와 공유하고 재사용할 수 있습니다. 구체적으로 다음과 같이 활용할 수 있습니다:

  1. 내장 함수: 자주 사용하는 함수(약속과 번역)를 미리 구현해두고 필요할 때 런타임에 삽입하기
  2. REPL(Read-Eval-Print Loop): Python IDLE와 같은 대화형 콘솔 구현하기
  3. 유틸리티 라이브러리: 자주 사용하는 함수들을 모아서 라이브러리처럼 사용하기

Base Context 기능은 다음과 같이 두 단계로 사용합니다.

1. 소스코드의 실행 결과(CodeFile)를 저장해두기

ts
import { CodeFile, yaksok } from '@dalbit-yaksok/core'

// baseCode는 문자열로 약속 코드를 정의합니다
const baseCode = `
약속, 힘든 부탁 하기
    "그건 제가 도와드릴 수 없어요" 보여주기
`

// yaksok 실행 결과에서 CodeFile 인스턴스를 추출합니다
const baseContext: CodeFile = (await yaksok(baseCode)).codeFiles['main']

재사용할 함수와 변수가 담긴 소스코드를 실행하고 그 결과를 변수에 저장합니다. 여기서 필요한 것은 CodeFile 인스턴스입니다. CodeFile 인스턴스는 yaksok 함수의 실행 결과 중 codeFiles 객체에 파일 이름별로 저장되며, 파일 이름을 별도로 지정하지 않으면 main이라는 이름으로 저장됩니다.

2. 이후에 실행하는 yaksok 함수에 전달하기

ts
// 저장된 baseContext를 사용하여 함수 실행
await yaksok(`힘든 부탁 하기`, {}, baseContext) // 출력: "그건 제가 도와드릴 수 없어요"

저장한 CodeFile 객체를 yaksok 함수의 세 번째 인자로 전달하면 이전 실행 환경에서 선언한 함수와 변수를 새로운 코드에서 사용할 수 있습니다.

전체 소스코드

ts
import { yaksok, CodeFile } from '@dalbit-yaksok/core'

// 기본 함수를 정의한 코드
const baseCode = `
약속, 힘든 부탁 하기
    "그건 제가 도와드릴 수 없어요" 보여주기
`

// 코드 실행 결과를 저장
const baseContext: CodeFile = (await yaksok(baseCode)).codeFiles['main']

// 저장된 함수 사용하기
await yaksok(`힘든 부탁 하기`, {}, baseContext) // 출력: "그건 제가 도와드릴 수 없어요"

주의 사항: 스코프는 재사용됩니다

ts
import { yaksok } from '@dalbit-yaksok/core'

// baseContext에 초기 상태를 저장
const baseContext = (
    await yaksok(`
카운터 = 1

약속, 힘든 부탁 하기
    "그건 제가 도와드릴 수 없어요" 보여주기
    카운터 = 카운터 + 1
`)
).codeFiles['main']

// 동일한 baseContext를 여러 번 재사용
await yaksok(`힘든 부탁 하기`, {}, baseContext) // 카운터가 2로 증가
await yaksok(`힘든 부탁 하기`, {}, baseContext) // 카운터가 3으로 증가
await yaksok(
    `"당신이 힘든 부탁을 한 횟수: " + 카운터 보여주기`,
    {},
    baseContext,
) // 출력: "당신이 힘든 부탁을 한 횟수: 3"

WARNING

주의: 동일한 baseContext를 재사용하면, 각 실행에서 변경된 변수 값이 그대로 유지됩니다.
위 예제에서 카운터 변수는 함수가 호출될 때마다 증가하여 최종적으로 3이 됩니다.
이러한 상태 유지는 의도적으로 활용할 수도 있지만, 예상치 못한 결과를 초래할 수도 있습니다.
상태를 초기화하고 싶다면 매번 새로운 baseContext를 생성하여 사용하세요.