6. 함수와 변수 재사용하기(Base Context)
Base Context는 약속 코드의 실행 결과를 저장하고 재사용할 수 있는 기능입니다. 이를 활용하면 함수와 변수를 다른 소스 코드와 공유하고 재사용할 수 있습니다. 구체적으로 다음과 같이 활용할 수 있습니다:
- 내장 함수: 자주 사용하는 함수(약속과 번역)를 미리 구현해두고 필요할 때 런타임에 삽입하기
- REPL(Read-Eval-Print Loop): Python IDLE와 같은 대화형 콘솔 구현하기
- 유틸리티 라이브러리: 자주 사용하는 함수들을 모아서 라이브러리처럼 사용하기
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
를 생성하여 사용하세요.