Comments (8)
Yes, but not in the same way as Ruby.
The problem is, we need to know the number and type of arguments at compile time. For example
def foo(x, y)
x + y
end
a = [1, 2, 3]
foo *a
This in Ruby gives wrong number of arguments at runtime, of course. But how can Crystal know that at compile time? (Crystal is not a dynamic language)
The answer is: this will not be possible in Crystal.
Instead, we will have a Tuple type. A tuple has a fixed size and each element has a (possible different) type. The syntax will probably be:
{1, "hello", 'a'} #=> Tuple(Int32, String, Char)
You can't add elements to a tuple and (most probably) you can't modify it: it's (most probably) immutable. Because of this the compiler can know the types and length of a tuple and you can use a splat to pass a tuple to a method. For example:
def foo(x, y)
x + y
end
a = {1, 2}
foo *a # ok, a has length 2 and types Int32, Int32 so that compiles
b = {1, 2, "hello"}
foo *b # error, doesn't compile
Although this severly reduces the power of the programming language, it allows to pass along splat arguments:
def foo(*args)
bar *args
end
Well... this is just an idea we have, it's not finished and we are still not sure about it. But for sure splats will never work with arrays types.
from crystal.
Let me see if I understand:
def foo(*a)
a
end
x = foo(1,2,3)
p x #=> {1,2,3}
p x.class #=> Tuple
from crystal.
Yes, exactly.
In fact, now that you mention it, doing that makes it unnecessary to have a special syntax for tuples.
def tuple(*args)
args
end
x = tuple 1, 2, 3
This is also how it is done in the D programming language: http://dlang.org/tuple.html
template Tuple(E...)
{
alias E Tuple;
}
auto tuple = Tuple!(1, 2 , 3);
It's also similar to the way you can create a Proc in Ruby:
def proc(&block)
block
end
p = proc { ... }
Hacky :-P
from crystal.
👍 Awesome. Looking forward to putting them little tuples to work.
from crystal.
@trans I just pushed a couple of commits that implement this :-)
Since it's so new you might find bugs in it. Also, don't try to combine default values with splats, I'm sure it doesn't work. But, at least, we can do more things now.
Soon... named arguments :-D
from crystal.
All of this, plus named arguments, work since version 0.4
from crystal.
Sweet!!! I'll start porting as soon.
from crystal.
Just beware that splats aren't supported in initialize
(I just checked it). I'll fix it soon.
from crystal.
Related Issues (20)
- Mise plugin for Crystal HOT 1
- `libssl` bindings fall back to ancient library version
- Actual nightly releases on Windows HOT 1
- Crystal tool context/implementations with ECR HOT 1
- `LLVM::TargetData` cannot be disposed
- Converting '*' to splat results in: Error: undefined macro method 'MacroId#map' HOT 4
- Spec: Time is not reported accurately HOT 2
- Windows Nightly Regression HOT 3
- Unwanted line break added by the formatter
- Implement new UUID versions (V6, V7, V8) HOT 2
- Installing system dependencies in the Windows GUI installer HOT 1
- Static linking mode fails on Arch Linux HOT 8
- Compiler crash when using a TypeDeclaration in the wrong spot HOT 1
- Command prompt escaping in `Process.quote_windows` HOT 2
- Comparisons between integers and floats are inexact
- `YAML::Any#dig` does not accept a string key HOT 1
- `Math.pow` returns different results between `Int` and `Float` exponents
- Some `IO::FileDescriptor` methods are implemented in `Crystal::System::File`
- Linking against the debug MSVC runtime libraries
- Permission denied opening `libiconv.dll` HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from crystal.