GOAL P3-5: StrId 를 키로 -- 별도 IntMap 은 필요 없다
std.map 은 바이트 열을 키로 받는다. 이름의 번호를 네 바이트로 써 내려놓으면 그대로 심볼 표가 된다. 감사가 권한 IntMap(V) 를 따로 만들 이유가 없고, 그 쪽이 trait 없는 v0.1 과도 덜 싸운다. intern.key_of 가 그 네 바이트를 써준다. 리졸버가 스코프마다 할 일이라 손으로 풀게 두지 않았다. scope x 10 y 20 of 2 245/245, 38/38.
This commit is contained in:
@@ -5,12 +5,14 @@
|
||||
// OUTPUT:find 1 missing yes
|
||||
// OUTPUT:hash steady yes apart yes
|
||||
// OUTPUT:copied unit 4
|
||||
// OUTPUT:scope x 10 y 20 of 2
|
||||
// OUTPUT:balanced
|
||||
unit interns;
|
||||
|
||||
import std.io;
|
||||
import std.sys;
|
||||
import std.intern;
|
||||
import std.map;
|
||||
|
||||
// One copy of every distinct name, and a number that stands for it. Comparing
|
||||
// two names is comparing two integers; storing one costs four bytes and no
|
||||
@@ -46,6 +48,15 @@ fn run() -> !void {
|
||||
var buf: [8]u8 = undefined;
|
||||
let n: usize = t.copy_into(a, buf[..]);
|
||||
@print("copied {} {}\n", buf[0..n], n);
|
||||
|
||||
// A symbol table is a Map keyed on the name's number. std.map keys on
|
||||
// bytes, so no separate integer-keyed map is needed.
|
||||
var scope: map.Map(i32) = try map.Map(i32).with_capacity(8);
|
||||
var key: [4]u8 = undefined;
|
||||
try scope.put(intern.key_of(a, key[..]), 10);
|
||||
try scope.put(intern.key_of(b, key[..]), 20);
|
||||
@print("scope x {} y {} of {}\n", scope.get(intern.key_of(a, key[..]), -1),
|
||||
scope.get(intern.key_of(b, key[..]), -1), scope.count_of());
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user