PasteRack.org
Paste # 80460
2023-11-01 18:10:29

Forked from paste # 7761.

Fork as a new paste.

Paste viewed 476 times.


Embed:

  1. #lang racket
  2.  
  3. (require (for-syntax racket/syntax
  4.                      syntax/parse))
  5.  
  6. ; don't forget to be `formal`!
  7.  
  8. (define-syntax (define-cached stx)
  9.   (syntax-parse stx
  10.     [(_ (fun:id fml:formal ...) body ...)
  11.      #:with fresh? (format-id stx "fresh?")
  12.      #'(define (fun (~@ . fml) ... #:fresh? [fresh? #f])
  13.          (define cached (fetch-funcall 'fun (list fml.name ...)))
  14.          (cond [(and cached (not fresh?)) cached]
  15.                [else
  16.                 (define result (let () body ...))
  17.                 (cache-funcall 'fun (list fml.name ...) result)]))]))
  18.  
  19. (define (cache-funcall name input result)
  20.   'cache-data)
  21.  
  22. (define (fetch-funcall name input)
  23.   'fetch-data)

=>