-
Notifications
You must be signed in to change notification settings - Fork 1k
Use scala-cli in Getting Started page #3072
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 4 commits
23d6dda
0ff5ba0
0959275
a85e51e
8e84db6
57efc0e
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -100,7 +100,8 @@ Run the following command in your terminal, following the on-screen instructions | |
Check your setup with the command `scala -version`, which should output: | ||
```bash | ||
$ scala -version | ||
Scala code runner version {{site.scala-3-version}} -- Copyright 2002-2022, LAMP/EPFL | ||
Scala code runner version: 1.4.3 | ||
Scala version (default): {{site.scala-3-version}} | ||
``` | ||
{% endaltDetails %} | ||
<!-- end Alternative Detail --> | ||
|
@@ -145,6 +146,146 @@ To install them manually: | |
or [AdoptOpenJDK 8/11](https://adoptopenjdk.net/). Refer to [JDK Compatibility](/overviews/jdk-compatibility/overview.html) for Scala/Java compatibility detail. | ||
1. Install [sbt](https://www.scala-sbt.org/download.html) | ||
|
||
## Using the Scala CLI | ||
|
||
In a directory of your choice, which we will call `<project-dir>`, create a file named `hello.scala` with the following code: | ||
```scala | ||
//> using scala {{site.scala-3-version}} | ||
|
||
@main | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add a |
||
def hello(): Unit = | ||
println("Hello, World!") | ||
``` | ||
|
||
You can define a method with the `def` keyword and mark it as a "main" method with the `@main` annotation, designating it as | ||
the entry point in program execution. The method's type is `Unit`, which means it does not return a value. `Unit` | ||
can be thought of as an analogue to the `void` keyword found in other languages. The `println` method will print the `"Hello, World!"` | ||
string to standard output. | ||
|
||
To run the program, execute `scala run hello.scala` command from a terminal, within the `<project-dir>` directory. The file will be compiled and executed, with console output | ||
similar to following: | ||
``` | ||
$ scala run hello.scala | ||
Compiling project (Scala {{site.scala-3-version}}, JVM (20)) | ||
Compiled project (Scala {{site.scala-3-version}}, JVM (20)) | ||
Hello, World! | ||
``` | ||
|
||
### Handling command-line arguments | ||
|
||
Rewrite the `hello.scala` file so that the program greets the person running it. | ||
```scala | ||
//> using scala {{site.scala-3-version}} | ||
|
||
@main | ||
def hello(name: String): Unit = | ||
println(s"Hello, $name!") | ||
``` | ||
|
||
The `name` argument is expected to be provided when executing the program, and if it's not found, the execution will fail. | ||
The `println` method receives an interpolated string, as indicated by the `s` letter preceding its content. `$name` will be substituted by | ||
the content of the `name` argument. | ||
|
||
To pass the arguments when executing the program, put them after `--`: | ||
``` | ||
$ scala run hello.scala -- Gabriel | ||
Compiling project (Scala {{site.scala-3-version}}, JVM (20)) | ||
Compiled project (Scala {{site.scala-3-version}}, JVM (20)) | ||
Hello, Gabriel! | ||
``` | ||
|
||
You can read more about [main methods](/scala3/book/methods-main-methods.html) and [string interpolation](/scala3/book/string-interpolation.html) in the Scala Book. | ||
|
||
### Adding dependencies | ||
|
||
We now write a program that will count the files and directories present in its working directory. | ||
We use the [os-lib](https://github.com/com-lihaoyi/os-lib) library from the [Scala toolkit](toolkit/introduction.html) | ||
for that purpose. A dependency on the library can be added with the `//> using` directive. Put the following code in `counter.scala`. | ||
```scala | ||
//> using scala {{site.scala-3-version}} | ||
//> using dep "com.lihaoyi::os-lib:0.10.7" | ||
|
||
@main | ||
def countFiles(): Unit = | ||
val paths = os.list(os.pwd) | ||
println(paths.length) | ||
``` | ||
|
||
In the code above, `os.pwd` returns the current working directory. We pass it to `os.list`, which returns a sequence | ||
of paths directly within the directory passed as an argument. We use a `val` to declare an immutable value, in this example storing the | ||
sequence of paths. | ||
|
||
Execute the program. The dependency will be automatically downloaded. The execution should result in a similar output: | ||
``` | ||
$ scala run counter.scala | ||
Compiling project (Scala {{site.scala-3-version}}, JVM (20)) | ||
Compiled project (Scala {{site.scala-3-version}}, JVM (20)) | ||
4 | ||
``` | ||
The printed number should be 4: `hello.scala`, `counter.scala` and two hidden directories created automatically when a program is executed: | ||
`.bsp` containing information about project used by IDEs, and `.scala-build` containing the results of compilation. | ||
|
||
As it turns out, the `os-lib` library is a part of Scala Toolkit, a collection of libraries recommended for tasks like testing, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. TBH, I'm not sure showing the alternative with the toolkit is a good idea here. We should definitely link to the toolkit's home page as a "next steps" scenario. But with what we already showed above, the user already "got started". There is no need to switch to the toolkit for no immediate reason. |
||
operating system interaction or handling JSONs. You can read more about the libraries included in the toolkit [here](/toolkit/introduction.html). | ||
To include the toolkit libraries, use the `//> using toolkit default` directive: | ||
gkepka marked this conversation as resolved.
Show resolved
Hide resolved
|
||
```scala | ||
//> using scala {{site.scala-3-version}} | ||
//> using toolkit 0.5.0 | ||
|
||
@main | ||
def countFiles(): Unit = | ||
val paths = os.list(os.pwd) | ||
println(paths.length) | ||
``` | ||
|
||
This program is identical to the one above. However, other toolkit libraries will also be available to use, should you need them. | ||
|
||
### Using the REPL | ||
|
||
You can execute code interactively using the REPL provided by the `scala` command. Execute `scala` in the console without any arguments. | ||
``` | ||
$ scala | ||
Welcome to Scala {{site.scala-3-version}} (20-ea, Java OpenJDK 64-Bit Server VM). | ||
Type in expressions for evaluation. Or try :help. | ||
|
||
scala> | ||
``` | ||
|
||
Write a line of code to be executed and press enter. | ||
``` | ||
scala> println("Hello, World!") | ||
Hello, World! | ||
|
||
scala> | ||
``` | ||
|
||
The result will be printed immediately after executing the line. You can declare values: | ||
``` | ||
scala> val i = 1 | ||
val i: Int = 1 | ||
|
||
scala> | ||
``` | ||
|
||
A new value of type `Int` has been created. If you provide an expression that can be evaluated, its result will be stored in an automatically created value. | ||
``` | ||
scala> i + 3 | ||
val res0: Int = 4 | ||
|
||
scala> | ||
``` | ||
You can exit the REPL with `:exit`. | ||
|
||
### Next steps | ||
|
||
Now that you have tasted a little bit of Scala, you can either explore the language itself, or learn how to set up a project using the | ||
sbt and an IDE using the tutorials below. If you want to familiarize yourself with the language more, consider checking out: | ||
|
||
* [The Scala Book](/scala3/book/introduction.html) (see the Scala 2 version [here](/overviews/scala-book/introduction.html)), which provides a set of short lessons introducing Scala’s main features. | ||
* [The Tour of Scala](/tour/tour-of-scala.html) for bite-sized introductions to Scala's features. | ||
* [Learning Resources](/learn.html), which includes online interactive tutorials and courses. | ||
* [Our list of some popular Scala books](/books.html). | ||
|
||
## Create a "Hello World" project with sbt | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Looks like this section should be removed, or moved to a separate page. |
||
|
||
Once you have installed sbt, you are ready to create a Scala project, which | ||
|
@@ -229,15 +370,5 @@ Otherwise, you can run the application from a terminal with these steps: | |
When you’re finished experimenting with this project, press `[Enter]` to interrupt the `run` command. | ||
Then type `exit` or press `[Ctrl+D]` to exit sbt and return to your command line prompt. | ||
|
||
## Next Steps | ||
|
||
Once you've finished the above tutorials, consider checking out: | ||
|
||
* [The Scala Book](/scala3/book/introduction.html) (see the Scala 2 version [here](/overviews/scala-book/introduction.html)), which provides a set of short lessons introducing Scala’s main features. | ||
* [The Tour of Scala](/tour/tour-of-scala.html) for bite-sized introductions to Scala's features. | ||
* [Learning Resources](/learn.html), which includes online interactive tutorials and courses. | ||
* [Our list of some popular Scala books](/books.html). | ||
* [The migration guide](/scala3/guides/migration/compatibility-intro.html) helps you to migrate your existing Scala 2 code base to Scala 3. | ||
|
||
## Getting Help | ||
There are a multitude of mailing lists and real-time chat rooms in case you want to quickly connect with other Scala users. Check out our [community](https://scala-lang.org/community/) page for a list of these resources, and for where to reach out for help. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@Gedochao updating this variable seems to be missing from the release procedure