std: str 과 list, 그리고 자동 drop 이 사용자 타입까지 닿는다
std.str 은 eq/starts_with/find/trim/parse_int 을 바이트 슬라이스 위에서 한다. std.list 는 자라는 제네릭 시퀀스다 -- 버퍼를 소유하므로 리스트를 놓으면 원소도 놓인다. 성장은 두 배씩이라 push 당 복사량이 상수로 눌린다. 찾은 버그 넷: - 메서드가 자기 타입의 유닛이 아니라 호출한 유닛에 속한 것으로 계산됐다. 다른 유닛의 제네릭 타입을 쓰면 필드가 전부 private 으로 보였다. - 참조로 도달한 메서드를 찾지 못했다. self.grow() 가 안 됐다. - 이미 참조인 수신자의 주소를 한 번 더 떠서 넘겼다. 포인터의 포인터를 받은 메서드가 그것을 구조체로 읽었다. - 유닛으로 한정된 제네릭 타입(list.List(i32))이 타입 자리에서도 식 자리에서도 해석되지 않았다. drop 을 가진 타입은 인스턴스마다 그 메서드가 존재해야 한다 -- 이름으로 부르는 사람이 없어도 스코프 정리가 부른다. 그리고 자기 drop 안에서는 필드를 꺼낼 수 있다. 객체가 사라지는 중이라 뒤에 남아 읽힐 것이 없다. run.py 207/207, exec.py 19/19.
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
// EXIT:0
|
||||
// OUTPUT:count 20 sum 190 balanced
|
||||
unit listuse;
|
||||
import std.io;
|
||||
import std.fmt;
|
||||
import std.list;
|
||||
import std.sys;
|
||||
|
||||
fn show(label: []u8, v: i32) -> void {
|
||||
var buf: [16]u8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
|
||||
let n: usize = fmt.fmt_i32(buf[..], v);
|
||||
io.print(label);
|
||||
io.print(" ");
|
||||
io.print(buf[0..n]);
|
||||
io.print(" ");
|
||||
}
|
||||
|
||||
fn build() -> !i32 {
|
||||
var xs: list.List(i32) = try list.List(i32).with_capacity(2);
|
||||
var i: i32 = 0;
|
||||
while i < 20 {
|
||||
try xs.push(i);
|
||||
i = i + 1;
|
||||
}
|
||||
var sum: i32 = 0;
|
||||
var k: usize = 0;
|
||||
while k < xs.count() {
|
||||
sum = sum + xs.at(k);
|
||||
k = k + 1;
|
||||
}
|
||||
show("count", xs.count() as i32);
|
||||
show("sum", sum);
|
||||
return sum;
|
||||
}
|
||||
|
||||
fn main() -> i32 {
|
||||
let sum: i32 = build() catch |e| { return 1; };
|
||||
if sum != 190 { return 2; }
|
||||
if sys.allocs() != sys.frees() { io.print("leaked\n"); return 3; }
|
||||
io.print("balanced\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
// EXIT:0
|
||||
// OUTPUT:ok 42 -7
|
||||
unit strings;
|
||||
import std.io;
|
||||
import std.str;
|
||||
import std.fmt;
|
||||
|
||||
fn show(v: i32) -> void {
|
||||
var buf: [16]u8 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];
|
||||
let n: usize = fmt.fmt_i32(buf[..], v);
|
||||
io.print(" ");
|
||||
io.print(buf[0..n]);
|
||||
}
|
||||
|
||||
fn main() -> i32 {
|
||||
if not str.eq(str.trim(" hello "), "hello") { return 1; }
|
||||
if not str.starts_with("ferro", "fer") { return 2; }
|
||||
if str.find("abcdef", "cd") != 2 { return 3; }
|
||||
if str.find("abcdef", "zz") != 6 { return 4; }
|
||||
let a: i32 = str.parse_int("42") orelse 0;
|
||||
let b: i32 = str.parse_int("-7") orelse 0;
|
||||
let bad: i32 = str.parse_int("12x") orelse 0;
|
||||
if bad != 0 { return 5; }
|
||||
io.print("ok");
|
||||
show(a);
|
||||
show(b);
|
||||
io.print("\n");
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user