Files
five/docs/RTL-Todo.md
Charles KWON OhJun 486e466592 feat: FiveSql2 43/43, @byref, mutable closure, RTL 479, DateTime fix
Major changes since last commit:
- FiveSql2 SQL:1999 engine (10,458 LOC) — 43/43 ALL PASS
- 21 compiler/runtime bugs fixed (short-circuit AND/OR, FOR LOOP, etc.)
- @byref pass-by-reference via RefCell pattern
- Mutable closure capture (EnsureLocalRef + RefCell sharing)
- RTL: 400 → 479 functions (+79: file, string, datetime, hash, UTF-8)
- DateTime/Timestamp fully working (hb_DateTime, hb_Hour/Min/Sec, display)
- Reserved word guard (39 keywords blocked from function calls)
- AEval arg order fix (element before index)
- Closure capture redecl fix (unique _cap_ names per block)
- Hash/string indexing in ArrayPush/ArrayPop
- Harbour compat test suite: 51/51
- 4 docs: Porting Report, Implementation Plan, Optimization Plan, Commercialization

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-11 11:35:37 +09:00

144 lines
6.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Five RTL 구현 목록 — 파일 + 문자열 + 날짜
**현재:** 417개 구현 / Harbour 1,011개
**이 목록 완료 시:** ~472개 (47%) → 비즈니스 앱 실질 커버리지 ~85%
---
## 1. 파일/디렉토리 (20개)
### 이미 있음 ✅
```
FOPEN, FCLOSE, FREAD, FWRITE, FSEEK, FCREATE, FERASE, FRENAME,
MEMOREAD, MEMOWRIT, DIRECTORY, CURDIR, DIRMAKE, DIRREMOVE,
HB_FILEEXISTS, HB_DIREXISTS, HB_DIRCREATE, HB_DIRBASE,
HB_FTEMPCREATE, HB_FNAMESPLIT, HB_FNAMEDIR, HB_FNAMEEXT,
HB_FNAMENAME, HB_FNAMEMERGE
```
### 구현 필요 (20개)
| # | 함수 | 설명 | Go 대응 | 난이도 |
|---|------|------|---------|--------|
| 1 | `HB_FSIZE(cFile)` | 파일 크기 (bytes) | `os.Stat().Size()` | 쉬움 |
| 2 | `HB_FCOPY(cSrc, cDst)` | 파일 복사 | `io.Copy` | 쉬움 |
| 3 | `HB_FEOF(nHandle)` | 파일 끝 확인 | `f.Read() == 0` | 쉬움 |
| 4 | `HB_FCOMMIT(nHandle)` | 파일 플러시 | `f.Sync()` | 쉬움 |
| 5 | `HB_FREADLEN(nH, nLen)` | N바이트 읽기 | `f.Read(buf)` | 쉬움 |
| 6 | `HB_FGETATTR(cFile)` | 파일 속성 | `os.Stat().Mode()` | 쉬움 |
| 7 | `HB_FSETATTR(cFile, n)` | 파일 속성 설정 | `os.Chmod()` | 쉬움 |
| 8 | `HB_FGETDATETIME(cFile)` | 파일 수정일시 | `os.Stat().ModTime()` | 중간 |
| 9 | `HB_FSETDATETIME(cFile, d, t)` | 파일 날짜 설정 | `os.Chtimes()` | 중간 |
| 10 | `HB_FLOCK(nH, nOff, nLen)` | 파일 잠금 | `syscall.Flock()` | 중간 |
| 11 | `HB_FUNLOCK(nH, nOff, nLen)` | 파일 잠금 해제 | `syscall.Flock()` | 중간 |
| 12 | `HB_FILEDELETE(cMask)` | 와일드카드 삭제 | `filepath.Glob` + `os.Remove` | 중간 |
| 13 | `HB_FILEMATCH(cFile, cMask)` | 와일드카드 매칭 | `filepath.Match` | 쉬움 |
| 14 | `HB_FNAMEEXISTS(cFile)` | 파일/디렉토리 존재 | `os.Stat()` | 쉬움 |
| 15 | `HB_FNAMEEXTSET(cFile, cExt)` | 확장자 변경 | `strings.TrimSuffix` + 추가 | 쉬움 |
| 16 | `HB_FNAMENAMEEXT(cFile)` | 이름+확장자 | `filepath.Base` | 쉬움 |
| 17 | `HB_MEMOREAD(cFile)` | 파일 전체 읽기 | 이미 `MEMOREAD` 있음, alias | 쉬움 |
| 18 | `HB_MEMOWRIT(cFile, cData)` | 파일 전체 쓰기 | 이미 `MEMOWRIT` 있음, alias | 쉬움 |
| 19 | `HB_DIRTEMP()` | 임시 디렉토리 경로 | `os.TempDir()` | 쉬움 |
| 20 | `HB_DISKSPACE(cDrive)` | 디스크 여유 공간 | `syscall.Statfs` | 중간 |
---
## 2. 문자열 (20개)
### 이미 있음 ✅
```
AT, RAT, SUBSTR, LEFT, RIGHT, PADR, PADL, PADC, STRTRAN, REPLICATE,
STUFF, UPPER, LOWER, ALLTRIM, LTRIM, RTRIM, SPACE, CHR, ASC, LEN,
VAL, STR, TRANSFORM, TOKEN, NUMTOKEN,
HB_VALTOEXP, HB_VALTOSTR, HB_NTOS, HB_CSTR,
HB_NUMTOHEX, HB_HEXTONUM, HB_STRTOHEX, HB_HEXTOSTR,
HB_TOKENGET, HB_TOKENCOUNT, HB_ATOKENS,
HB_UTF8LEN, HB_UTF8SUBSTR, HB_UTF8TOSTR, HB_STRTOUTF8,
HB_UTF8AT, HB_UTF8LEFT, HB_UTF8RIGHT
```
### 구현 필요 (15개)
| # | 함수 | 설명 | Go 대응 | 난이도 |
|---|------|------|---------|--------|
| 1 | `HB_AT(cSub, cStr [,nFrom])` | AT + 시작위치 | `strings.Index` + offset | 쉬움 |
| 2 | `HB_RAT(cSub, cStr)` | 뒤에서 찾기 + 확장 | `strings.LastIndex` | 쉬움 |
| 3 | `HB_ATI(cSub, cStr)` | 대소문자 무시 찾기 | `strings.ToUpper` + `Index` | 쉬움 |
| 4 | `HB_ATX(cRegex, cStr)` | 정규식 찾기 | `regexp.FindString` | 중간 |
| 5 | `HB_LEFTEQI(cStr, cPrefix)` | 대소문자 무시 시작 비교 | `strings.EqualFold` | 쉬움 |
| 6 | `HB_ASCIIISALPHA(n)` | 알파벳 여부 | `unicode.IsLetter` | 쉬움 |
| 7 | `HB_ASCIIISDIGIT(n)` | 숫자 여부 | `unicode.IsDigit` | 쉬움 |
| 8 | `HB_ASCIIISLOWER(n)` | 소문자 여부 | `unicode.IsLower` | 쉬움 |
| 9 | `HB_ASCIIISUPPER(n)` | 대문자 여부 | `unicode.IsUpper` | 쉬움 |
| 10 | `HB_STRISUTF8(cStr)` | UTF-8 유효성 | `utf8.Valid` | 쉬움 |
| 11 | `HB_STRDECODESCAPE(cStr)` | \n \t 등 이스케이프 | `strconv.Unquote` | 중간 |
| 12 | `HB_STRXOR(cStr, cKey)` | XOR 암호화 | byte loop | 쉬움 |
| 13 | `HB_WILDMATCH(cMask, cStr)` | 와일드카드 매칭 | `filepath.Match` | 쉬움 |
| 14 | `HB_WILDMATCHI(cMask, cStr)` | 대소문자 무시 와일드카드 | `ToUpper` + `Match` | 쉬움 |
| 15 | `HARDCR(cStr)` | Soft CR → Hard CR | `strings.ReplaceAll` | 쉬움 |
---
## 3. 날짜/시간 (20개)
### 이미 있음 ✅
```
DATE, DAY, MONTH, YEAR, DOW, CDOW, CMONTH,
DTOS, STOD, DTOC, CTOD, SECONDS, TIME,
HB_DATETIME, HB_HOUR, HB_MINUTE, HB_SEC, HB_SECOND,
HB_TTOS, HB_STOT, HB_TTOC, HB_CTOT, HB_MILLISECONDS
```
### 구현 필요 (20개)
| # | 함수 | 설명 | Go 대응 | 난이도 |
|---|------|------|---------|--------|
| 1 | `HB_DATE(nY, nM, nD)` | 날짜 생성 | Julian 변환 | 쉬움 |
| 2 | `HB_CTOD(cDate, cFmt)` | 포맷 지정 문자열→날짜 | `time.Parse` | 중간 |
| 3 | `HB_DTOC(dDate, cFmt)` | 포맷 지정 날짜→문자열 | `time.Format` | 중간 |
| 4 | `HB_STOD(cDate)` | "YYYYMMDD"→날짜 | 이미 `STOD` 있음, alias | 쉬움 |
| 5 | `HB_DTOT(dDate)` | Date→Timestamp (자정) | Julian + 0ms | 쉬움 |
| 6 | `HB_TTOD(tTimestamp)` | Timestamp→Date (시간 제거) | Julian만 | 쉬움 |
| 7 | `HB_TTOHOUR(tTS)` | 시 추출 | ms / 3600000 | 쉬움 |
| 8 | `HB_TTOMIN(tTS)` | 분 추출 | ms / 60000 % 60 | 쉬움 |
| 9 | `HB_TTOSEC(tTS)` | 초 추출 | ms / 1000 % 60 | 쉬움 |
| 10 | `HB_TTOMSEC(tTS)` | 밀리초 추출 | ms % 1000 | 쉬움 |
| 11 | `HB_TTON(tTS)` | Timestamp→초 (자정부터) | ms / 1000 | 쉬움 |
| 12 | `HB_NTOT(dDate, nSec)` | Date+초→Timestamp | Julian + sec*1000 | 쉬움 |
| 13 | `HB_NTOHOUR(nSec)` | 초→시 | nSec / 3600 | 쉬움 |
| 14 | `HB_NTOMIN(nSec)` | 초→분 | nSec / 60 % 60 | 쉬움 |
| 15 | `HB_NTOSEC(nSec)` | 초→초 (mod 60) | nSec % 60 | 쉬움 |
| 16 | `HB_WEEK(dDate)` | ISO 주차 | `time.ISOWeek` | 쉬움 |
| 17 | `HB_CDAY(nDow)` | 요일 번호→이름 | `time.Weekday.String` | 쉬움 |
| 18 | `DAYS(nSec)` | 초→일수 | nSec / 86400 | 쉬움 |
| 19 | `ELAPTIME(cStart, cEnd)` | 경과시간 "HH:MM:SS" | 파싱 + 차이 | 중간 |
| 20 | `AMPM(cTime)` | "13:00"→"01:00 PM" | 파싱 + 변환 | 쉬움 |
---
## 4. 추가 필수 유틸 (5개)
| # | 함수 | 설명 | Go 대응 | 난이도 |
|---|------|------|---------|--------|
| 1 | `HB_SETENV(cVar, cVal)` | 환경변수 설정 | `os.Setenv` | 쉬움 |
| 2 | `HB_PS()` | 경로 구분자 | `string(os.PathSeparator)` | 쉬움 |
| 3 | `HB_EOL()` | 줄바꿈 문자 | `"\n"` 또는 `"\r\n"` | 쉬움 |
| 4 | `HB_ISNULL(x)` | Empty string/NIL | `IsNil \|\| ""` | 쉬움 |
| 5 | `ERRORSYS()` | 기본 에러 핸들러 | stub | 쉬움 |
---
## 요약
| 카테고리 | 추가 수 | 쉬움 | 중간 |
|----------|---------|------|------|
| 파일/디렉토리 | 20 | 14 | 6 |
| 문자열 | 15 | 13 | 2 |
| 날짜/시간 | 20 | 17 | 3 |
| 유틸 | 5 | 5 | 0 |
| **합계** | **60** | **49** | **11** |
**예상 시간:** 쉬움 49개 × 5분 + 중간 11개 × 15분 = **~7시간**
**완료 후 RTL:** 417 + 60 = **477개** (47%)
**비즈니스 앱 실질 커버리지:** ~85%