#include <stdio.h>
int a = 1;
namespace A {
int a = 2;
namespace B {
int a = 3;
int fun() {
printf("%d %d %d\n", a, A::a, ::a); //3 2 1
}
}
}
int main() {
A::B::fun();
using namespace A; //引入A::a到全局空间
//int a = 4; //声明,没问题, 因为作用域不同
printf("A space: %d %d\n", a, ::a); //error: reference to ‘a’ is ambiguous: ::a or A::a
}
;;A.ss
(library (A)
(export a)
(import (chezscheme))
(define a 123))
(define a 1)
a ;==> 1
(import (A)) ;;在当前目录找到A.ss, 加载, 导入符号。
a ;==> 123 //A中的a遮蔽了顶层变量
(top-level-value 'a) ;==> 1
(define a 1)
(let () (import (A)) a) ;==> 123
a ;==> 1 import也是static lexical scope的。
结论:
1. 在main中定义namespace: namespace definition is not allowed here
2. lexical scope: 从最里层往外查找变量。
3. "::v" 表示引用全局空间的,即没有包在命名空间中的。
4. using namepace ns 只能引入到全局空间。