lower: mem.create / alloc_slice / destroy / replace

할당하는 내장 함수들이다. 평범한 호출이 아니라서 여기서 편다. create 는 값을
받아 그 복사본을 가리키는 소유 포인터를 주고, 할당이 실패할 수 있으므로 결과가
에러 유니온이다. 실패 코드는 OutOfMemory 이고, 소스 어디에도 그 이름이 적혀
있지 않지만 다른 이름과 같은 표에 들어간다.

갓 할당한 저장소는 통째로 소유하므로 쓸 수 있다 -- 방해할 사람이 없다. 그래서
alloc_slice 는 ^[]mut T 를 준다. 소유 슬라이스는 포인터와 길이가 값 자체라서
.^ 로 통과할 것이 없고, destroy 는 그 안의 포인터를 푼다.

heap 프로그램이 할당·try·defer 해제·for 순회를 한꺼번에 돈다: sum 4950
This commit is contained in:
2026-08-17 06:29:18 +09:00
parent 231c7d564b
commit 9510f12643
3 changed files with 210 additions and 3 deletions
+30
View File
@@ -0,0 +1,30 @@
// EXIT:0
// OUTPUT:sum 4950
unit heap;
import std.io;
import std.fmt;
fn build(n: usize) -> !^[]mut i32 {
var cells: ^[]mut i32 = try mem.alloc_slice(i32, n);
var i: usize = 0;
while i < n {
cells.^[i] = i as i32;
i = i + 1;
}
return cells;
}
fn main() -> i32 {
let cells: ^[]mut i32 = build(100) catch |e| { return 1; };
defer { mem.destroy(cells); }
var sum: i32 = 0;
for v in cells.^ {
sum = sum + v.^;
}
var buf: [16]u8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
let k: usize = fmt.fmt_i32(buf[..], sum);
io.print("sum ");
io.print(buf[0..k]);
io.print("\n");
return 0;
}