Thanks, good point,

Summing up, this idiom is well suited for keeping constants, say

module MathConstants
  export pi, e, speed_of_light
  const pi = 3.14159265897
  e = 2.718281828
  speed_of_light = 3e9
...
end

after adding

using MathConstants

it is possible to use pi without prefix (actually pi is already defined, 
this is just for example).

For more general use, say reading parameters from config files (i.e. values 
should mutate), it is better to stick to what Stefan proposed.

Thanks for the comments,
Alexander


On Tuesday, January 21, 2014 10:05:10 PM UTC+4, Ivar Nesje wrote:
>
> Another possibility is to use a module with declared constants.
>
> module CParam
>    export rho, cc # the exports are optional but allows you to type "using 
> CParam" and use rho and cc without CParam prefix
>
>    const rho = 3.2
>    const cc = 54.4
> end
>
> Or you can just use rho and cc as global constants.
>
> Just one word of caution. If you want performance you need to remember the 
> "const" declaration. Currently the julia runtime system assumes that 
> globals might change their type at any point, so it will have to check the 
> type every time it reads the variable.
>
> Ivar
>
> kl. 17:42:18 UTC+1 tirsdag 21. januar 2014 skrev Alexander Samoilov 
> følgende:
>>
>> Ok, thanks.
>>
>> I got the idea.
>>
>> On Tuesday, January 21, 2014 8:31:19 PM UTC+4, Stefan Karpinski wrote:
>>>
>>> Julia's singleton types are abstract types whose only instance is a 
>>> single type object. This is useful for writing methods that dispatch on 
>>> type values rather than on the type of an argument. They are abstract types 
>>> – they don't have fields and they don't hold data.
>>>
>>> If you want an object to store some values, define a type and make a 
>>> single instance of it:
>>>
>>> type CParam
>>>   rho::Float64
>>>   cc::Float64
>>> end
>>> const cparam = CParam(0,0)
>>>
>>>
>>> Now use cparam as your "singleton" – if you don't want more than one 
>>> instance, don't create more than one.
>>>
>>>
>>>
>>> On Tue, Jan 21, 2014 at 10:57 AM, Alexander Samoilov <
>>> [email protected]> wrote:
>>>
>>>> Hello Experts!
>>>>
>>>> After reading Julia docs on types it is still unclear for me how how to 
>>>> use singleton classes for common tasks, e.g. for packaging some common 
>>>> values.
>>>>
>>>> As a side note let me elaborate with the example from Scala programming 
>>>> language.
>>>> Scala has intrinsic support for singletons - Objects.
>>>>
>>>> ```scala
>>>> scala> object CParam {
>>>>      | var rho: Double = 1.0
>>>>      | var cc: Double = 1.0
>>>>      | }
>>>> defined module CParam
>>>>
>>>> scala> CParam.rho = 2.0
>>>> CParam.rho: Double = 2.0
>>>>
>>>> scala> import CParam._
>>>> import CParam._
>>>>
>>>> scala> rho
>>>> res0: Double = 2.0
>>>> ```
>>>>
>>>> Now trying to project it to Julia:
>>>>
>>>> ```jlcon
>>>> julia> type CParam
>>>>          rho::Float64
>>>>          cc::Float64
>>>>          function CParam()
>>>>            new(0.0, 0.0)
>>>>          end
>>>>        end
>>>>
>>>> julia> x = CParam()
>>>> CParam(0.0,0.0)
>>>>
>>>> julia> x.rho
>>>> 0.0
>>>> ```
>>>>
>>>> So good so far, though this is not a singleton, just an instance.
>>>> The Julia documentation says that parametric Type{T} is a special 
>>>> parametric kind of the type T - the singleton type.
>>>>
>>>>
>>>> ```jlcon
>>>> julia> x = Type{CParam}
>>>> Type{CParam}
>>>>
>>>> julia> x.rho
>>>> ERROR: type DataType has no field rho
>>>> ```
>>>>
>>>> Trying to exploit modules as model for singleton class (follow 
>>>> Fortran90 - it uses modules for information hiding and packaging).
>>>>
>>>> ```jlcon
>>>> julia> module CParam
>>>>             export rho, bulk, cc, zz
>>>>             rho  = 1.0 
>>>>             bulk = 1.0 
>>>>             cc   = 1.0 
>>>>             zz   = 1.0 
>>>>        end
>>>>  
>>>> julia> CParam.rho  = 2.0
>>>> ERROR: cannot assign variables in other modules
>>>> ```
>>>> Could you please recommend a programming idiom better fitting to Julia?
>>>>
>>>> Thanks!
>>>> Alexander
>>>>
>>>>
>>>

Reply via email to