Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/murarth/rusti
REPL for the Rust programming language
https://github.com/murarth/rusti
repl rust
Last synced: about 2 months ago
JSON representation
REPL for the Rust programming language
- Host: GitHub
- URL: https://github.com/murarth/rusti
- Owner: murarth
- License: other
- Archived: true
- Created: 2014-12-16T17:15:28.000Z (about 10 years ago)
- Default Branch: master
- Last Pushed: 2019-07-12T17:55:59.000Z (over 5 years ago)
- Last Synced: 2024-08-01T22:58:15.256Z (5 months ago)
- Topics: repl, rust
- Language: Rust
- Size: 374 KB
- Stars: 1,321
- Watchers: 38
- Forks: 58
- Open Issues: 11
-
Metadata Files:
- Readme: README.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# Rusti
A REPL for the Rust programming language.
**The rusti project is deprecated. It is not recommended for regular use.**
## Dependencies
On Unix systems, Rusti requires `libncursesw` (`libncurses` on Mac OS).
## Building
Rusti builds with Rust nightly, using the Cargo build system.
Currently, it **must** be built using a nightly release of the Rust compiler
released **no later than 2016-08-01**.The recommended method of installation is to use the following command to
[rustup](https://github.com/rust-lang-nursery/rustup.rs):rustup install nightly-2016-08-01
### Installation using Cargo
Rusti can be installed directly using Cargo. The following command will
download, compile, and install Rusti, placing it in `~/.cargo/bin/` or your
operating system equivalent, assuming you haved installed `nightly-2016-08-01`
using `rustup`:rustup run nightly-2016-08-01 cargo install --git https://github.com/murarth/rusti
Then you can run it like this:
rustup run nightly-2016-08-01 ~/.cargo/bin/rusti
### Building from a Git clone
If using [rustup](https://github.com/rust-lang-nursery/rustup.rs),
the following command will create an override to use the correct nightly build
within the `rusti` source tree:rustup override add nightly-2016-08-01
Build with Cargo:
cargo build
Run tests:
cargo test
Run `rusti`:
cargo run
Install:
cargo install
## Usage
Running `rusti` gives a prompt that accepts (most) any valid Rust code.
If the final statement is an expression, the result will be displayed using the
`std::fmt::Debug` trait. This is equivalent to `println!("{:?}", expr);`.```rust
rusti=> println!("Hello, world!");
Hello, world!
rusti=> 2 + 2
4
rusti=> (0..5).collect::>()
[0, 1, 2, 3, 4]
```If any delimiters are left open, `rusti` will continue reading input until they are closed.
Only then will the code be executed.```rust
rusti=> fn factorial(n: u32) -> u32 {
rusti.> match n {
rusti.> 0 => 0,
rusti.> 1 => 1,
rusti.> n => n * factorial(n - 1),
rusti.> }
rusti.> }
rusti=> factorial(3)
6
rusti=> factorial(4)
24
rusti=> factorial(5)
120
````rusti` can also run a file given on the command line.
Note that a `rusti` input file is not quite the same as a typical Rust program.
A typical Rust program contains a function named `main`. While a `rusti`
program can define functions, no functions will be called automatically.
Instead, all statements not within a function body will be executed sequentially,
just like interactive mode.### Loading Crates
Loading crates which are part of the standard Rust distribution is as easy as
declaring the crate, thusly:```rust
extern crate foo;
```However, loading a crate that you have compiled yourself requires some extra steps:
* First, `rusti` must be able to find the location of compiled crate.
You can add a path to its search list using the command line option `-L path`.
`rusti` accepts any number of `-L` arguments.
* Secondly, `rusti` requires both an `rlib` and a `dylib` version of the
compiled crate. If you're building your crate with Cargo, the following
command will build the required files for your project's library:cargo rustc --lib -- --crate-type=rlib,dylib
If you're building with rustc directly, simply add `--crate-type=rlib,dylib`
to the build command to produce the required files.### Code completion
`rusti` provides optional support for code completion using [Racer](https://github.com/phildawes/racer).
To enable code completion, install Racer as outlined in the [Installation Instructions](https://github.com/phildawes/racer#installation) and place the `racer` executable into your `PATH`.
## Commands
These are special inputs interpreted by `rusti` that are not directly
evaluated as Rust code, though they may operate on Rust code.Commands are invoked by entering a line beginning with `.` or `:`, followed by the
name of the command and, perhaps, some text used by the command.Command names may be arbitrarily abbreviated.
For example, `.type` may be abbreviated as `.typ`, `.ty`, or `.t`.### `.block`
The `.block` command will run multiple lines of Rust code as one program.
To end the command and run all code, input `.` on its own line.
```rust
rusti=> .block
rusti+> let a = 1;
rusti+> let b = a * 2;
rusti+> let c = b * 3;
rusti+> c
rusti+> .
6
```Entering `.q` instead will end the command without running code.
### `.exit`
The `.exit` command exits the REPL loop.
### `.help`
The `.help` command shows usage text for any available commands.
### `.load`
The `.load` command evaluates the contents of a named file.
### `.print`
The `.print` command will display the value of an expression, using the
`std::fmt::Display` trait. This is equivalent to `println!("{}", expr);`.### `.type`
The `.type` command will display the type of an expression without running it.
```rust
rusti=> .type 42
42 = i32
rusti=> .t 'x'
'x' = char
rusti=> .t "Hello!"
"Hello!" = &'static str
rusti=> .t (1i32, 2u32)
(1i32, 2u32) = (i32, u32)
rusti=> fn foo() -> i32 { 1 }
rusti=> .t foo
foo = fn() -> i32 {foo}
rusti=> .t foo()
foo() = i32
```## Limitations
Currently, Rusti has the following limitations.
I hope to fix each of them, but some may prove to be large problems to tackle.* Functions and types are redefined in each round of input.
This is inefficient.
* `static` items are also redefined in each round of input.
This means that the address of a `static` item will change in every round
of input and that the values of `mut` items or those with interior mutability
will be reset to their initial definition on each round of input.
This is bad.
* Use of `thread_local!` causes a crash.
This is bad.
* `let` declarations are local to the input in which they are defined.
They cannot be referenced later and are destroyed after that round of input
completes its execution.
This is inconvenient.
* And more!## License
Rusti is distributed under the terms of both the MIT license and the
Apache License (Version 2.0).See LICENSE-APACHE and LICENSE-MIT for details.