git @ Cat's Eye Technologies Dipple / master standard-ml / Standard-ML-Examples.md
master

Tree @master (Download .tar.gz)

Standard-ML-Examples.md @masterview rendered · raw · history · blame

Standard ML Examples
====================

<!--
SPDX-FileCopyrightText: Chris Pressey, the original author of this work, has dedicated it to the public domain.
For more information, please refer to <https://unlicense.org/>
SPDX-License-Identifier: Unlicense
-->

    -> Functionality "Evaluate Standard ML expression"
    -> is implemented by shell command
    -> "cp %(test-body-file) /tmp/foo.sml && echo ';printVal it' >>/tmp/foo.sml && mosml -quietdec /tmp/foo.sml"

    -> Tests for functionality "Evaluate Standard ML expression"

Some basic expressions.

    1
    ===> 1

    ~100 * ~100 * ~100
    ===> ~1000000

A conditional.

    if true then 5 else 6
    ===> 5

The basic usage of `let` to create name bindings.

    let val a = 2 in a end
    ===> 2

    let fun r(x) = 77 in r(1) end
    ===> 77

    let fun r(x) = x in r(66) end
    ===> 66

You can also use `val` and `fn` to define function values in a `let`.

    let val r = fn(x) => x in r(66) end
    ===> 66

ML's `let` is like Scheme's `let*`: later bindings can refer to earlier ones.

    let
      fun r(x) = x * 2
      fun p(x) = r(x) * 2
    in
      p(10)
    end
    ===> 40

However in a `let`, earlier bindings cannot refer to later ones.

Skipping because I don't know why `mosml` doesn't report this error under `falderal`.
It does when you run it from the command line.

>    main() =
>    let
>      fun oddp(x)  = if x = 0 then false else evenp(x - 1)
>      fun evenp(x) = if x = 0 then true else oddp(x - 1)
>    in
>      evenp(6)
>    end
>    ???> Unbound value identifier: evenp

You need to use `rec` in order to let earlier bindings refer to later ones,
and you need to use `and` between all the mutually recursive functions.

    let
      val rec oddp = fn(x)  => if x = 0 then false else evenp(x - 1)
      and rec evenp = fn(x) => if x = 0 then true else oddp(x - 1)
    in
      evenp(6)
    end
    ===> true

    let
      val rec oddp = fn(x)  => if x = 0 then false else evenp(x - 1)
      and rec evenp = fn(x) => if x = 0 then true else oddp(x - 1)
    in
      evenp(7)
    end
    ===> false