Как объявлять внешние функции в модулях

У меня есть следующий алгоритм, который я написал в модуле Julia

module two_algo

export two

function two(type)
  a = construct(type)
  b = construct(type)
  result = construct(type)
  unity(a)
  unity(b)
  add(a,b,result)
  return result
end

end

Когда-то у меня был этот алгоритм, определенный вне модуля, и он компилировался и мог отправлять в любой тип, который определял методы конструкции, единства и добавления. Но внутри модуля он не компилируется. Он не знает, как найти конструкцию, единство и сложение. Я не хочу импортировать их из какого-то конкретного модуля, потому что у меня может быть много модулей, каждый из которых, например, определяет конструкцию, единство и добавление. Что мне нужно сделать, чтобы это скомпилировалось? Помню, как в старые времена, когда я работал с C / C ++, я делал что-то столь же простое, как объявление конструкции extern; внутри модуля. Я действительно надеюсь, что смогу оставить функцию two (), чтобы она принимала один тип, а не передавала функции, которые реализуют конструкцию, единство и добавление. В идеале я бы также хотел избежать дженериков. Спасибо за любые указатели.

Чтобы увидеть небольшой пример кода до того, как я попытался разбить его на модули, см .: github.com/bdezonia / jzorb / tree / master / src   —  person Barry    schedule 18.01.2021

См. также:  VSCode с WSL2 - отложенный запуск из-за отсутствия ответа на ping
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 2
  1. Barry
  2. Barry

    Это небольшая модификация ответа Франсуа, которая решила мою проблему. Я все еще принимаю его ответ, потому что он сделал львиную долю открытий и работы.

    module UnityBase
        export unity
        
        function unity end
    end
    
    module AddBase
        export add
        
        function add end
    end
    
    module TwoAlgo
        using ..UnityBase, ..AddBase
        export two
    
        function two(T)
            a = unity(T)
            add(a, a)
        end
    end
    
    module MyTypeMod
        using ..AddBase, ..UnityBase
        export MyType
        
        struct MyType
            val :: Int
        end
    
        UnityBase.unity(::Type{MyType}) = MyType(1)
        AddBase.add(a::MyType, b::MyType) = MyType(a.val + b.val)
    end
    
    using .TwoAlgo
    using .MyTypeMod
    
    println(two(MyType))
    
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: