I'm not completely sure what you want, so the following handles both 
unbound identifiers in function position, as well as expressions in 
function position that have a value but the value is not a procedure. It 
delegates to a macro and a function respectively, that you can play with 
separately without fully understanding the main handler. 

#lang racket

; We'll override ...
#;(f a ...) ; ... when f is not a macro, i.e. when this is by default a 
function call.

(module app-hook racket
  
  (provide (rename-out [our-app #%app]))
  
  (require syntax/parse/define)

  ; Will delegate to here at expansion time when f is an unbound 
identifier, for maximum control.
  (define-simple-macro (call-with-unbound f a ...)
    ; For example, you could ...
    (list 'f a ...))

  ; Will delegate to here at run time if f evaluates to a non-procedure.
  (define (call-with-non-procedure f . as)
    ; For example, you could ...
    (list* f as))

  (define-syntax-parser our-app
    [(_ f:id a ...)
     #:when (not (identifier-binding #'f))
     (syntax/loc this-syntax
       (call-with-unbound f a ...))]
    [(_ f a ...)
     (syntax/loc this-syntax
       (let ([f-value f]) ; standard macro side-effect safety : evaluate f 
expression only once
         (if (procedure? f-value)
             (f-value a ...)
             (call-with-non-procedure f-value a ...))))]))

(require 'app-hook)

(g (length '(a b c))) #;'(g 3)

(length (g '(a b c))) #;2

((+ 1 2) (+ 30 40 50)) #;'(3 120)

((println "once"))

; To Do (for an “industrial strength” version) : are we okay with the error 
messages from ...
#;()
#;(a . b)
#;(#:k)
#;((values 1 2))

On Thursday, August 13, 2020 at 3:55:42 PM UTC-4 lysseus wrote:

> Hi guys,
>
> Pollen makes use of something like this:
>
> (require syntax/parse/define)
>
> (define-simple-macro (#%top . x) 'x)
>
>
> and it comes in handy in some of my projects. But I’m wondering if there’s 
> an equivalent for redirecting an application that hasn’t been defined? 
>
> In other words, if foo is not a procedure then (foo 1 2 3) would redirect 
> to (do-this foo 1 2 3) where do-this is defined?
>
> Any help is appreciated. 
>
> Thanks!
>
> Kevin

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to racket-users+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/025156f8-ec1c-46cd-a924-7a8f731fc6e0n%40googlegroups.com.

Reply via email to