logoalt Hacker News

teo_zero • yesterday at 11:55 PM • 3 replies • view on HN

I'd like to come up with some constructive comments, but I find everything so inconsistent and alien to me...

For example, variable declarations use the pattern <colon> <type>, as in

  var a: Int32
But literals follow the opposite syntax, as in

  a = Int32: 42
The return type of a function is introduced by : in func definitions, but by -> in imported func declarations:

  func foo(a:Int):Int
  import func bar(a:Int) -> (Int)
Other construct that I find far from my habits:

  var w, h, d = 640, 480, 2
instead of the more obvious (for me):

  var w=640, h=480, d=2
Arguments are passed by ref, not by val. Good luck with recursion!

Replies

marckerbiquet • today at 8:30 AM

Author here. The language has still many inconsistencies but not these ones.

Import functions is done the same way:

  func foo(a: Int): Int
  import func foo(Int): Int
May be the doc is outdated.

The multiple declaration is consistent with assignment:

  var w, h = 640, 480
  w, h = 640, 680
  w, h = getBoundingBox(obj)
The syntax

  var a = Int: 32
is unusual compared to many other languages because it just use a simple syntax:

  var id = expr
The type is prefixed only to resolve literals:

  var a = Int32: 42
  var b = Uint8: 42
It can be useful in generic functions:

  println("The answer is \a", Float32: 42)
But to create uninitialized variables I had to keep the syntax:

  var id: Type
yxhuvud • today at 5:07 AM

The parallel assignment just work mostly like it does in ruby so that doesn't look weird to me (except the need for 'var' in the first place).

Agreed on the rest, though I don't understand what the problem would be with recursion. Is it using reference passing also for primitives like integers?

➕ show 2 replies
metadat • today at 3:02 AM

Agreed.. and what is going on with the `!` syntax? The docs are not exactly clear on the purpose in all cases.

https://tibleiz.net/copper/documentation.html#basic-syntax

➕ show 1 reply