Skip to content

LeifAndersen/racket-sml

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 

Repository files navigation

S-Markup Language

The S-Markup Language is a simple markup language that embeds the full power of the Racket ecosystem.

The top level of an SML file is a set of key-value pairs, with possible definitions. For convenience, keys can be any identifier that ends in a colon (:), but technically can be any value. For example:

#lang sml

title: "A readme file"
author: me

(define me "Leif")

Any values inside of square brackets ([ and ]) become a list:

#lang sml
title: "A readme file"
author: ["Leif" "Ben"]

Any values inside of curly braces ({ and }) becomes a dictionary:

#lang sml
title: "A readme file"
author: [{name: "Leif"
          location: "MA"}
         {name: "Ben"
          location: "MA"}]

Finally, double curly braces become strings, and can use Racket's @-expressions to escape to SML code. For example (using semi-colon for comments):

#lang sml ; readme.sml
title: "A readme file"
author: [{name: "Leif"
          location: {{Cambridge, @MA}}}
         {name: "Ben"
          location: {{Boston, @MA}}}]

(define MA "Massachusetts")

Otherwise the syntax is that of Racket with s-expressions enabled.

The data in each SML program is provided in a hash table called doc. Using the repl with the above program:

> (require "readme.sml")
> doc
'#hash((author . (#hash((location . "Cambridge, Massachusetts") (name . "Leif")) #hash((location . "Bostn, Massachusetts") (name . "Ben")))) (title . "A readme file"))

And you can get the data using Racket's dictionary API.

Additionally, if you need runtime parameters to build, this can be done with the #:inputs keyword:

#lang sml ; data.sml
#:inputs (hyperlink)

(define project
  {name: "SML"
   link: "https://github.com/LeifAndersen/racket-sml"})

text:
{{Find SML at @hyperlink[project].}}

Now doc is a function that takes the #:inputs expression:

> (require "data.sml")
> doc
#<procedure:doc>
> (doc (lambda (a) (hash-ref a 'link)))
'#hash((text . "Find SML at https://github.com/LeifAndersen/racket-sml"))

FAQ

Q: What does the S in SML stand for?

A: Small, Silly, Stupid, Smart, S-Expression, Stunning, Something else? I don't know, you pick.

Q: How is this related to Standard ML?

A: It's not. Standard ML is awesome though, and you should check out SML/NJ.

Q: Why another markup language?

A: I had a CV to write, and I got sick of every other markup language. And its only about 100 lines, why not?

About

No description or website provided.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages