Giter Site home page Giter Site logo

lsgxeva / shen.clj Goto Github PK

View Code? Open in Web Editor NEW

This project forked from hraberg/shen.clj

1.0 2.0 1.0 1.25 MB

神.clj | Shen for Clojure. Shen is a portable functional programming language by Mark Tarver.

Home Page: shenlanguage.org

License: Other

Shell 0.26% Clojure 15.92% Shen 83.82%

shen.clj's Introduction

神.clj | Shen for Clojure

http://shenlanguage.org/

Shen is a portable functional programming language by Mark Tarver that offers

  • pattern matching,
  • λ calculus consistency,
  • macros,
  • optional lazy evaluation,
  • static type checking,
  • an integrated fully functional Prolog,
  • and an inbuilt compiler-compiler.

See also: Shen.java

This Clojure Port

[shen.clj "0.1.6"] | Marginalia

Is a work in progress. Passes the Shen 6.0 test suite.

Uses Leiningen 2 to build. The script build is used for full, repeatable builds.

To run the REPL:

Standalone release

java -jar shen.clj-0.1.6-standalone.jar

Leiningen

lein trampoline run

# If shen.clj already exists, for readline support:
lein repl

# java:
java -cp lib/clojure-1.4.0.jar:shen.clj-0.1.6.jar shen

Plain

./shen.clj

Shen 2010, copyright (C) 2010 Mark Tarver
www.lambdassociates.org, version 7.1
running under Clojure, implementation: Clojure 1.4.0 [jvm 1.8.0-ea]
port 0.1.6 ported by Håkan Råberg


(0-) (define super
       [Value Succ End] Action Combine Zero ->
         (if (End Value)
             Zero
             (Combine (Action Value)
                      (super [(Succ Value) Succ End]
                             Action Combine Zero))))
super

(1-) (define for
       Stream Action -> (super Stream Action do 0))
for

(2-) (define filter
       Stream Condition ->
         (super Stream
                (/. Val (if (Condition Val) [Val] []))
                append
                []))
filter

(3-) (for [0 (+ 1) (= 10)] print)
01234567890

(4-) (filter [0 (+ 1) (= 100)]
             (/. X (integer? (/ X 3))))
[0 3 6 9 12 15 18 21 24 27 30 33 36 39 42 45 48 51 54 57 60... etc]

The Shen Test Suite

The Shen test suite is now running, slowly but surely:

[... loads of output ...]
passed ... 146
failed ...0
pass rate ...100%

ok
0

run time: 16.713 secs
loaded

The suite can be run via:

yes | lein trampoline run -m shen.test

The benchmarks can be run via:

JAVA_OPTS="-Xss6m" lein run -m shen.benchmarks
  • Performance is not a goal for 0.1.x, but some tuning has been made to ease development.

Libraries

神, define, prolog? and defprolog macros

Instead of using Shen's reader, you can embed Shen directly in Clojure using these macros. For simplicity, all Shen code lives and is evaluated in the shen namespace for now (this will likely change).

; shen.test/shenlanguage.org
(define for
  Stream Action -> (super Stream Action do 0))

; shen.test/printer
(
 (cons 1 2))
"[1 | 2]"

(
 (@p 1 2))
"(@p 1 2)"

; shen.test/partials
(
 ((λ X Y (+ X Y)) 2))
fn?

As can be seen λ stands in for /. in Shen to avoid Clojure reader macros. @p, @s and @v are converted from Clojure deref to their Shen symbols. Characters, like \;, will also be converted to symbols.

Note that [] in Shen are lists, and not Clojure vectors. A Clojure vector with a count of 2 is used to represent a cons pair internally.

See shen.test for more examples.

Shen calling Clojure

Embedded

Shen code can (but this is not very tested) access clojure.core, which is required as c:

(
  (c/with-out-str
    (for [0 (+ 1) (= 10)] print)))
"\"0123456789\""
Shen FFI

Shen FFI can be used for (basic) interaction with Clojure from Shen:

(load "ffi.shen")
(ffi clj (@p shen->clj send-clj) (@p clj->shen receive-clj))

; Clojure map entries as Shen lists
(call-ffi clj *clojure-version*)
[[:major | 1] [:minor | 4] [:incremental | 0] [:qualifier | nil]]

; Calling Java
(call-ffi clj (System/currentTimeMillis))
1336093159995

More advanced mixing and requiring of Clojure packages isn't supported yet.

Roadmap

This port, while aiming to conform closely (and hopefully fully) to the Shen specification, has its primary goal to enable Shen's power in real world Clojure code.

  • Shen / Clojure interop:
    • Shen packages as namespaces?
    • Hiding Shen internal names.
    • Bringing smaller parts of Shen goodness back into Clojure: predicate dispatch, pattern matching, prolog. Maybe even the type system.
    • Ensuring Shen can call Clojure/Java properly.
  • Future / Questions
    • More TCO than implicit recur for KLambda?
    • Making Shen as lazy as its host?
    • Existing Shen libraries and portability?
    • ClojureScript.
    • overwrite.clj - rewriting more parts of Shen into Clojure if interop or performance requires it.
  • Shen in 15 minutes as smoke test for the REPL

The other port, Shen to Clojure

http://code.google.com/p/shen-to-clojure/

License

http://shenlanguage.org/license.html

Shen, Copyright © 2010-2012 Mark Tarver

shen.clj, Copyright © 2012 Håkan Råberg


YourKit is kindly supporting open source projects with its full-featured Java Profiler. YourKit, LLC is the creator of innovative and intelligent tools for profiling Java and .NET applications. Take a look at YourKit's leading software products: YourKit Java Profiler and YourKit .NET Profiler.

shen.clj's People

Contributors

alexbaranosky avatar hraberg avatar

Stargazers

Alan D. Salewski avatar

Watchers

lsgx avatar  avatar

Forkers

salewski

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.