Skip to content

Instantly share code, notes, and snippets.

@jozip
Forked from qerub/gist:969308
Created May 13, 2011 06:50
Show Gist options
  • Save jozip/970097 to your computer and use it in GitHub Desktop.
Save jozip/970097 to your computer and use it in GitHub Desktop.
Objective-R: Objective-C-like syntax for method calls in Racket
#lang racket
; TODO: Add support for nested method calls
(require syntax/stx)
(provide read read-syntax)
;; Apply/Eval for this schemelet
(define (apply-objective-r form)
(apply send `(,(car form) ',(cadr form) ,@(cddr form))))
(define (eval-objective-r form)
(cond
((symbol? (car form))
(apply-objective-r form))
((list? (car form))
(eval-objective-r (cons (eval-objective-r (car form)) (cdr form))))
(else
'error-of-some-kind)))
(define (read in)
(let ((stx (read-syntax #f in)))
(if (eof-object? stx) stx (syntax->datum stx))))
(define (read-syntax src in)
(read-syntax/recursive src in #f (objective-r-readtable)))
(define (objective-r-readtable)
(define (handle-method-call ch in src line col pos)
(rewrite (read-syntax/recursive (object-name in) in #\[ #f)))
(define (rewrite stx)
(match (stx->list stx)
((list obj message args ...)
#`(send #,obj '#,message #,@args))))
(make-readtable (current-readtable)
#\[ 'terminating-macro handle-method-call))
; Example:
(read (open-input-string "[[document get-element-by-id stuff] remove]"))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment