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:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user