julia-符号标识符Core.Symbol(第12讲)

符号标识符Core.Symbol

1.1.定义:
    用于表示已解析julia代码(AST)中的标识符的对象类型。也经常用作名称或标签来标识实体(如作为字典键)
1.2.说明:
    能够将自定义的语言代码表示为语言本身的数据结构;
    Symbol是不可变;是不支持对字符进行迭代的“原子”或“标量”实体
    在表达式上下文中符号用于指示对变量的访问;
    当计算表达式时,在适当的范围内,符号将替换为绑定到该符号的值
    
1.3.用途:
    符号用于表示元编程中的变量;
    可将赋值、函数调用 、文本表达式表示成符号
 
2.1.创建:
    # 用:语法符号名称必须是有效标识符
    :foo           # :foo

    # 有时需在参数周围加括号:以免在解析时产生歧义:
    :(:)           # :(:)
    :(::)          # :(::)

    #Symbol(x...) -> Symbol将参数字符串连接在一起来创建
    Symbol("foo")  # 构造函数创建:#:foo
    Symbol("x", 1) # :x1
    Symbol(:var,'_',"sym")# :var_sym

2.2.比较:
    :foo===Symbol("foo") # 高效-只能比较指针 true

2.3.计算:

实例1:显示标签内容
    foo="hello",eval(:foo)#"hello"
    x = 42,eval(:x)       # 42

实例2:更改标签内容
    sym = :foo# :foo 
    eval(sym) #"hello"
     
    ex = :($sym = "world"; 1 + 2)
    :(begin
        foo = "world"
        1 + 2
      end)
     
    eval(ex)# 3
    foo     # "world"

 

实例3:通过字符串调用函数time()

fn = "time"
Symbol(fn)#:time

getfield(Main, Symbol(fn))()# 1.580791892769e9 ,相当于调用 time() 函数
eval(Meta.parse("$fn()"))   # 1.591600693101e9  不安全

 
实例4:迭代递归动态调用函数

fn = "deg2rad" # 将角度转为弧度

# 为了获得最佳性能,必须使用常量绑定f
const f = getfield(Main, Symbol(fn))#进行const绑定
 
function fast(n)
    t = 0.0
    for i = 1:n
        t += f(i)# 递归中使用
    end
    return t
end
 
@time fast(10^6) # 第一次使用会执行JIT编译 0.001049 seconds
@time fast(10^6) # 第二次会更快            0.001006 seconds  

#查看代码执行情况
@code_llvm fast(100000)
# ...
# ; ┌ @ math.jl:245 within `deg2rad'
# ...

# 如需在多个地方动态指定函数将函数f作为参数传递:
function fast(f,n)
    t = 0.0
    for i = 1:n
        t += f(i)
    end
    return t
end
 
@time fast(getfield(Main, Symbol(fn)), 10^6)# 0.001661 seconds (6 allocations: 192 bytes)
@time fast(getfield(Main, Symbol(fn)), 10^6)#0.001014 seconds (2 allocations: 32 bytes)

 

 

你可能感兴趣的:(julia)