由于julia和python/ruby/perl非常像,没什么可以整理的,所以这里只做记录备忘

环境搭建

安装julia 进入repl 按]进入安装包模式

add IJulia

多重派发

引自这篇文章

动态实现c++函数重载的效果

from functools import singledispatch

@singledispatch
def fun(arg, verbose=Falase):
    print(arg)
    
@fun.register(int)
def _(arg, verbose=False):
    print(arg)
abstract type TypeA end

struct TypeB <: TypeA end
struct TypeC <: TypeA end

wooo(a1::TypeA, a2::TypeA) = println("A/A")
wooo(a::TypeA, b::TypeB) = println("A/B")

callme(a1::TypeA, a2::TypeA) = wooo(a1, a2)

b = TypeB(); c = TypeC();
callme(c, b)

类型系统

Julia的类型主要分为抽象类型(Abstract Type)和实体类型(Concrete Type),实体类型主要分为可变类型(Mutable Type)和不可变类型(Immutable Type)

abstract type AbstractType end

struct ImmutableType <: AbstractType
end

mutable struct MutableType <: AbstractType
end

抽象类型使用 abstract type 关键字 匹配 end声明。默认的合成类型都是不可变类型,使用 struct 搭配 end 声明。而可变类型在 struct 前面增加 mutable 关键字即可。某个实体类型(concrete type)是另外一个抽象类型(abstract type)或者抽象类型是另外一个抽象类型的子类,这样的关系使用 <: 来声明。

一个抽象类型的所有子类型会构成一颗树,其中实体类型一定在树的叶子结点

下面这个 view_tree 函数会对一颗类型树进行深度优先遍历(DFS)

using InteractiveUtils # 0.7 之后需要调用这个标准库

function view_tree(T, depth=0)
    println("  "^depth, T)
    for each in subtypes(T)
        view_tree(each, depth+1)
    end
end

view_tree(AbstractType)

运行会得到AbstractType作为父节点的类型树

AbstractType
  ImmutableType
  MutableType

这个设计观点很新颖

c++是吧这些东西放到编译期来做

参考

  • https://rogerluo.me/Brochure.jl/dev/ 文档不错