proposing a simpler mechanism
R. Kent Dybvig
(13 Nov 2009 03:00 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 04:23 UTC)
|
Re: proposing a simpler mechanism
Taylor R Campbell
(13 Nov 2009 04:31 UTC)
|
Re: proposing a simpler mechanism R. Kent Dybvig (13 Nov 2009 16:22 UTC)
|
Re: proposing a simpler mechanism
Per Bothner
(13 Nov 2009 16:56 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 04:54 UTC)
|
Re: proposing a simpler mechanism
Alex Queiroz
(13 Nov 2009 13:44 UTC)
|
Re: proposing a simpler mechanism
Marc Feeley
(13 Nov 2009 14:24 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 18:39 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 18:36 UTC)
|
Re: proposing a simpler mechanism
Alex Queiroz
(13 Nov 2009 19:08 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 19:21 UTC)
|
Re: proposing a simpler mechanism
David Van Horn
(13 Nov 2009 19:25 UTC)
|
Re: proposing a simpler mechanism
Thomas Bushnell BSG
(13 Nov 2009 19:36 UTC)
|
Re: proposing a simpler mechanism
David Van Horn
(13 Nov 2009 19:58 UTC)
|
Re: proposing a simpler mechanism
Arthur A. Gleckler
(13 Nov 2009 20:25 UTC)
|
Re: proposing a simpler mechanism
David Van Horn
(12 Jan 2010 18:51 UTC)
|
> > What do you expect procedure-arity to return for a procedure which > > accepts any number of arguments? IEEE +inf? > -1, presumably. The numerical value isn't significant; its > representation as a bit string in two's-complement is what matters, > and for -1 that is a bit string of all ones. Right. In effect, a two's complement number has an infinite number of sign bits. For negative numbers, the sign bits are all one (set), which allows procedure-arity to represent the arity of a procedure that accepts n or more arguments, for any n. Here are some examples: bitmask two's complement proc accepts: 0 #b0...00000 nothing, i.e., it raises raises an exception no matter how many arguments it receives 1 #b0...00001 zero arguments 2 #b0...00010 one argument 4 #b0...00100 two arguments 6 #b0...00110 one or two arguments 5 #b0...00101 zero or two arguments -1 #b1...11111 any number of arguments -2 #b1...11110 one or more arguments -4 #b1...11100 two or more arguments -3 #b1...11101 zero or two or more arguments (but not one argument) Here's a procedure an implementation might use to compute a bitmask for a single formal parameter list represented in the obvious way. (define formals->bitmask (lambda (fmls) (let loop ([fmls fmls] [n 0]) (cond [(null? fmls) (bitwise-arithmetic-shift-left 1 n)] [(symbol? fmls) (bitwise-arithmetic-shift-left -1 n)] [else (loop (cdr fmls) (+ n 1))])))) (formals->bitmask '()) ;=> 1 (formals->bitmask '(a b)) ;=> 4 (formals->bitmask 'r) ;=> -1 (formals->bitmask '(a b . r)) ;=> -4 Here's another procedure that computes an aggregate bitmask for a list of formal parameter lists, as for a case-lambda expression. (define formals*->bitmask (lambda (fmls*) (apply bitwise-ior (map formals->bitmask fmls*)))) (formals*->bitmask '()) ;=> 0 (formals*->bitmask '((a) (a b))) ;=> 6 (formals*->bitmask '(() (a b . r))) ;=> -3 And for your bitmask-visualization pleasure: (define print-bitmask (lambda (bitmask) (let f ([bitmask bitmask] [minbits 4]) (cond [(= bitmask 0) (display "#b0...0") (display (make-string minbits #\0))] [(= bitmask -1) (display "#b1...1") (display (make-string minbits #\1))] [else (f (bitwise-arithmetic-shift-right bitmask 1) (max (- minbits 1) 0)) (write-char (if (bitwise-bit-set? bitmask 0) #\1 #\0))])))) (print-bitmask 3) #b0...00011 > (print-bitmask -3) #b1...11101