Checkout screenshots of my latest "web app" :
Pretty lame, right? Perhaps not, allow to me to explain.
What you're looking at are some interactions with web-apply, a crude framework for binding arbitrary Scheme functions to a web page. Here's how it works. First, you start with any old functions. Here's three toy ones:
(define (string-reverse x) (apply string (reverse (string->list x)))) (define (tip-calc amt) (map (lambda (percent) (cons percent (exact->inexact (+ amt (* (/ percent 100) amt))))) '(10 15 20))) (define (random-within x y) (+ x (random-integer (- y x))))
Then you bind these functions to a particular port and path:
(tcp-service-register! (list server-address: "*" port-number: 9000 eol-encoding: 'cr-lf) (web-fn-dispatcher `(("/rev" . (,string-reverse #t)) ("/tip" . (,tip-calc number)) ("/rand" . (,random-within number number)))))
tcp-service-register! is built into Gambit Scheme and takes care of accepting TCP connections. web-fn-dispatcher implements trivial HTTP handling and allows for interaction with a browser. The framework has one more trick up it's sleeve: you can pass an output parameter to declare how you want the output rendered. By default, a basic HTML page is generated, though you can pass in display or write to output the content using the aptly named Scheme function.
And here's the cool part: this framework was built in, and explicitly runs on Gambit Scheme on Android. So the above bindings effectively turn my cell phone into a resource an arbitrary user can browse to and interact with.
So why bother writing web-apply? I'm glad you asked. Here are three reasons:
- web-apply demonstrates just how powerful Gambit Scheme is on Android. Threads and sockets Just Work, including the ability to debug at the REPL. Combined with Droid Edit, you can really get creative and program dang near anything.
- If I try hard enough, I can imagine a circumstance where a team of individuals would want quick and dirty access to interact with some code, and web-apply gives you exactly this.
- web-apply should play nice with Tasker, as Tasker allows for easy execution of HTTP requests. This should allow you to code a task mainly using Tasker's standard environment, but jump into the Scheme world when it's convenient.
Of course, this should be considered alpha level code. But it's fun alpha level code, so feel free to play around with it.