-
-
Save jozip/970097 to your computer and use it in GitHub Desktop.
Objective-R: Objective-C-like syntax for method calls in Racket
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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