Skip to content

h3rald/concatenative

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

20 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Concatenative

Concatenative implements a stack-based DSL to use concatenative programming in Ruby. Because of its high-level implementation, it is not nearly as fast as ordinary Ruby code, but it can be used to learn the basics of concatenative programming without having to learn another programming language.

Concatenative’s syntax is still valid Ruby code, but resambles a concatenative programming language like Joy (www.latrobe.edu.au/philosophy/phimvt/joy.html).

Installation

The simplest method to install Concatenative is to install the gem:

gem install concatenative

Usage

Initialization: require ‘concatentive’

Execute a Concatenative program:

concatenate( 10, [0, :==], [1, :+], [:dup, 1, :-], [:*], :linrec )

The program above returns the factorial of 10, computed using the linrec combinator. It is also possible to execute arrays directly and define concatenative programs as symbols, as folows:

:factorial <= [0, :==], [:pop, 1], [:dup, 1, :- , :factorial, :*], :if [5, :factorial].execute

The program above calculates the factorial of 5, using explicit recursion.

You can use all Ruby methods in Concatenative programs as well, making sure that the right number of arguments (and the method’s receiver) are retrieved from the stack correctly. For this to work, Concatenative must know the arity of the method in advance, so the following rules are applied:

  • All operators have an arity of 1

  • All other method have an arity of 0

  • If a method has a different arity, you must specify it explicitly using the pipe (|) operator.

Example:

concatenate( “Goodbye, World!”, /Goodbye/, “Hello”, :sub|2 )

The program above is equivalent to "Goodbye, World!".sub(/Goodbye/, "Hello").

About

A Ruby DSL for concatenative programming

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages