+ Add annotated callbacks.
Callbacks may now be annotated with arbitrary arguments with which the function will be called. See surflets/test.scm for a (non-didactic) example. * The extended callbacks justify an extra structure for callbacks: surflets/callbacks - make-callback was moved from surflets/utilities to surflets/callbacks
This commit is contained in:
		
							parent
							
								
									c3e7abbdeb
								
							
						
					
					
						commit
						c48f952cc5
					
				|  | @ -63,3 +63,6 @@ | |||
|        (else | ||||
| 	(error "annotated-address: unknown message/bad argument(s)"  | ||||
| 	       message (address-name address))))))) | ||||
| 
 | ||||
|        | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,25 @@ | |||
| ;; Copyright 2002, 2003 Andreas Bernauer | ||||
| 
 | ||||
| (define (make-callback function) | ||||
|   (call-with-current-continuation | ||||
|    (lambda (exit) | ||||
|      (let* ((req (send/suspend (lambda (new-url) | ||||
| 				 (exit new-url))))) | ||||
|        (function req))))) | ||||
| 
 | ||||
| 
 | ||||
| (define (make-annotated-callback function) | ||||
|   (let* ((annotated-address (make-annotated-address)) | ||||
| 	 (dispatch  | ||||
| 	  (lambda (req) | ||||
| 	    (let ((bindings (get-bindings req))) | ||||
| 	      (cond | ||||
| 	       ((returned-via annotated-address bindings) => | ||||
| 		(lambda (args) | ||||
| 		  (apply function (cons req args)))) | ||||
| 	       (else | ||||
| 		(error "annotated-callback:  | ||||
| unexpected return values from website")))))) | ||||
| 	 (callback (make-callback dispatch))) | ||||
|     (lambda args | ||||
|       (annotated-address callback args)))) | ||||
|  | @ -307,7 +307,6 @@ | |||
| (define-interface surflets/utilities-interface | ||||
|   (export form-query-list | ||||
| 	  rev-append | ||||
| 	  make-callback | ||||
| 	  generate-unique-name)) | ||||
| 
 | ||||
| ;; Intelligent Addresses | ||||
|  | @ -319,6 +318,10 @@ | |||
| ;	  address-add-annotation! | ||||
| 	  address-annotation)) | ||||
| 
 | ||||
| (define-interface surflets/callbacks-interface | ||||
|   (export make-callback | ||||
| 	  make-annotated-callback)) | ||||
| 
 | ||||
| ;; Returned-via (dispatcher for input-fields and intelligent | ||||
| ;; addresses) | ||||
| (define-interface surflets/returned-via-interface | ||||
|  | @ -401,7 +404,6 @@ | |||
| 	threads				;SLEEP | ||||
| 	uri				;URI-PATH-LIST->PATH | ||||
| 	with-locks			;WITH-LOCK | ||||
| ;	inspect-exception		;WITH-INSPECTING-HANDLER | ||||
| 	) | ||||
|   (files surflet-handler)) | ||||
| 
 | ||||
|  | @ -551,8 +553,7 @@ | |||
| ;; Some utilities | ||||
| (define-structure surflets/utilities surflets/utilities-interface | ||||
|   (open scheme | ||||
| 	parse-html-forms | ||||
| 	(subset surflet-handler/primitives (send/suspend))) | ||||
| 	parse-html-forms) | ||||
|   (files utilities)) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -563,8 +564,17 @@ | |||
| 	(subset uri (escape-uri)) | ||||
| 	define-record-types | ||||
| 	(subset surflets/utilities (generate-unique-name))) | ||||
| ) | ||||
|   (files addresses)) | ||||
| 
 | ||||
| (define-structure surflets/callbacks surflets/callbacks-interface | ||||
|   (open scheme | ||||
| 	srfi-23				;error | ||||
| 	surflets/addresses | ||||
| 	(subset surflet-handler/primitives (send/suspend)) | ||||
| 	surflets/bindings | ||||
| 	surflets/returned-via) | ||||
|   (files callbacks)) | ||||
| 
 | ||||
| (define-structure surflets/returned-via surflets/returned-via-interface | ||||
|   (open scheme | ||||
|  |  | |||
|  | @ -20,13 +20,6 @@ | |||
| 	(rev-app (cdr a) (cons (car a) b)) | ||||
| 	b))) | ||||
| 
 | ||||
| (define (make-callback function) | ||||
|   (call-with-current-continuation | ||||
|    (lambda (exit) | ||||
|      (let* ((req (send/suspend (lambda (new-url) | ||||
| 				 (exit new-url))))) | ||||
|        (function req))))) | ||||
| 
 | ||||
| ;; FIXME: consider creating small names | ||||
| (define generate-unique-name | ||||
|   (let ((id 0)) | ||||
|  |  | |||
|  | @ -1,23 +1,40 @@ | |||
| (define-structure surflet surflet-interface | ||||
|   (open scheme-with-scsh | ||||
| 	surflets | ||||
| 	surflets/utilities | ||||
| 	surflets/callbacks | ||||
| 	httpd-responses) | ||||
|   (begin | ||||
|     (define global '()) | ||||
| 
 | ||||
|     (define select (make-select-input-field '("a" "b" "c") #t '(@ (size 2)))) | ||||
| 
 | ||||
|     (define (result req arg) | ||||
|       (send-html | ||||
|        `(html (title "Result") | ||||
| 	      (body (h2 "Result") | ||||
| 		    (p "Returned via callback with arg" (br) | ||||
| 		       ,(format #f "~s" arg)))))) | ||||
|      | ||||
|     (define (main req) | ||||
|       (set! global (cons 1 global)) | ||||
|       (let* ((addr (make-annotated-address)) | ||||
|       (let* ((an-cb (make-annotated-callback result)) | ||||
| 	     (addr (make-annotated-address)) | ||||
| 	     (req (send-html/suspend | ||||
| 		  (lambda (new-url) | ||||
| 		    `(html (body (h1 "This is from SUrflet") | ||||
| 				 (p "called " ,(length global) " times") | ||||
| 				 (url ,(addr new-url "ab=ba")) (br) | ||||
| 				 (url ,(addr new-url "be<ta")) (br) | ||||
| 				 (url ,(addr new-url)) (br) | ||||
| 				 (abba) | ||||
| 				 (p "Choose an annotated address:" (br) | ||||
| 				    (ul | ||||
| 				     (li (url ,(addr new-url "ab=ba") "ab=ba")) | ||||
| 				     (li (url ,(addr new-url "be<ta") "be<ta")) | ||||
| 				     (li  (url ,(addr new-url) "<nothing>")))) | ||||
| 				 (p "Or choose an annotated callback" (br) | ||||
| 				    (ul | ||||
| 				     (li (url ,(an-cb 13) "13")) | ||||
| 				     (li (url ,(an-cb '(1 2 3)) "'(1 2 3)")) | ||||
| 				     (li (url ,(an-cb "hello") "hello")) | ||||
| 				     (li (url ,(an-cb #f) "#f")))) | ||||
| 				 (surflet-form | ||||
| 				  ,new-url | ||||
| 				  POST | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 interp
						interp