@hypercubed/f-flat

    0.0.7 • Public • Published

    F♭

    F♭ (pronounced F-flat) is a toy language.

    F♭ is a dynamically typed array-oriented concatenative language like Forth, Joy, and others. F♭ is meant to be used interactively, for example in a CLI REPL, like R or the command shell, or in a stack based calculator. This constraint dictates many of the language features.

    Features

    Flat functional concatenative language

    Stack based

    RPN

    Dynamic Types

    Arbitrary-precision decimal and complex number type.

    JSON format is a valid f-flat programs.

    Why?

    • Designing a programming language in another language is a great way to learn about programming languages in general and the host language in particular.

    • Concatenative languages, with inherent functional composition, are a great way to explore functional programming and mathematics. Higher order functions (including math functions) are composed of smaller functions.

    • Because 0.1 + 0.2 = 0.3 and sqrt of -1 is not "not a number".

    Example

    asciicast

    Welcome to F♭ REPL Interpreter
    F♭ Version 0.0.0 (C) 2000-2017 J. Harshbarger
     
    f♭> 0.1 0.2 +
    [ 0.3 ]
     
    f♭> 0.3 =
    [ true ]
     
    f♭> clr
    []
     
    f♭> -1 sqrt
    [ 0+1i ]
     
    f♭> 1 atan 4 *
    [ 0+1i, 3.1415926535897932385 ]
     
    f♭> * exp
    [ -1-3.7356616720497115803e-20i ]
     
    f♭> abs
    [ 1 ]
     
    f♭> clr
    []
     
    f♭> [ 2 swap ^ 1 - prime? ] "mersenne?" def
    []
     
    f♭> 10 integers
    [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] ]
     
    f♭> [ mersenne? ] map
    [ [ true, true, true, false, true, false, true, false, false, false ] ]
     
    f♭> clr
    []
     
    f♭> 1000 !
    [ 4.0238726007709377384e+2567 ]
     
    f♭> clr
    []
     
    f♭> i !
    [ 0.49801566811835599106-0.15494982830181068731i ]
     
    f♭> { first: "Manfred" }
    [ { first: 'Manfred' } ]
     
    f♭> { last: 'von Thun' }
    [ { first: 'Manfred' }, { last: 'von Thun' } ]
     
    f♭> +
    [ { first: 'Manfred', last: 'von Thun' } ]
     
    f♭> clr
    [  ]
     
    f♭> [ 1 2 3 ]
    [ [ 1 2 3 ] ]
     
    f♭> dup
    [ [ 1 2 3 ] [ 1 2 3 ] ]
     
    f♭> [ 2 * ]
    [ [ 1 2 3 ] [ 1 2 3 ] [ 2 * ] ]
     
    f♭> map
    [ [ 1 2 3 ] [ 2 4 6 ] ]
     
    f♭> +
    [ [ 1 2 3 2 4 6 ] ]
     
    f♭> +
    [ [ 1 2 3 2 4 6 ] ]
     
    f♭> clr
    [  ]
     
    f♭> dbl-sqr-cat: [ dup [ 2 * ] map + ] ;
    [  ]
     
    f♭> [ 1 2 3 ]
    [ [ 1 2 3 ] ]
     
    f♭>  dbl-sqr-cat
    [ [ 1 2 3 2 4 6 ] ]
     
    f♭> 'dbl-sqr-cat' see
    [ '[ dup [ 2 * ] map + ]' ]
     
    f♭> drop
    [  ]
     
    f♭> dbl-sqr-cat: expand
    [ dup,2,*,*,Symbol((),swap,eval,dequote,+ ]
     

    See other examples and guides here.

    Project Goals

    • conceptually simple
    • interactive first
      • minimal hidden state
      • easy to type and read
      • reads left to right, top to bottom
      • whitespace not significant syntax
      • no lambdas/parameters
      • interactive development
      • case insensitive
    • flat concatenative language
      • name code not values
      • multiple return values
      • concatenation is composition/pipeline style
      • no unnecessary parentheses
    • no surprises
      • immutable data
      • arbitrary-precision decimal and complex numbers
      • percent values
      • both double and single quotes
      • returns error objects (TBD)
    • pure functions
    • host language interface (TBD)
    • session saving (TBD)
      • undo/redo
      • state is serializable (TBD)
    • modules, namespaces, and "closures"

    Influences

    License

    MIT

    Install

    npm i @hypercubed/f-flat

    DownloadsWeekly Downloads

    8

    Version

    0.0.7

    License

    MIT

    Unpacked Size

    397 kB

    Total Files

    136

    Last publish

    Collaborators

    • hypercubed