Thanks, I just added it.<br><br><div class="gmail_quote">On Mon, Nov 9, 2009 at 7:21 PM, Chongkai Zhu <span dir="ltr">&lt;<a href="mailto:czhu@cs.utah.edu">czhu@cs.utah.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="im">Doug Williams wrote:<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
I&#39;ve written a describe function for PLT Scheme - because I always liked it in Common Lisp. I&#39;ll put it on PLaneT eventually, but was wondering if anyone had suggestions for what to include. Data types that are there now that I&#39;m pretty comfortable with are: Booleans, numbers, strings, byte strings, characters, symbols, regular expressions, byte regular expressions, keywords, lists, pairs (improper lists), mutable lists, mutable pairs (improper mpairs), vectors, boxes, hashes, procedures, and void.<br>

<br>
</blockquote>
<br></div>
Don&#39;t forget eof.<br>
<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"><div><div></div><div class="h5">
I may have gone a bit overboard with giving the names of integers (up to 10^102), but the Symbolics Common Lisp describe function did it and I always liked showing it off. So, I included it. But, it might make sense to limit it to fixums just to keep the name from getting so long.<br>

<br>
I&#39;m pretty happy with procedure descriptions with the number of positional arguments and required and optional keywords. (I still need to handle the case of the optional keywords list being #f - that is, allow any keyword.) I&#39;m curious about whether a primitive closure is different from a primitive procedure - for example, can you get the result arity for a primitive closure like you can for a primitive procedure. And, what is a example of a primitive closure so I can include a test for it?<br>

<br>
I&#39;ve included recursively describing boxes and hashes. It shouldn&#39;t be a problem for boxes, but hash descriptions could get rather long when I include descriptions of the key values. Would it make sense to have a recursive? arguments to control this? If recursive? is implemented should it also apply to lists, vectors, etc? I&#39;m concerned about inundating the user with detail where it isn&#39;t needed. [Maybe the best thing is to limit recursive descriptions to boxes.]<br>

<br>
Structs and objects are somewhat more problematic. If a struct responds to struct?, I can get some details with struct-&gt;vector. So, I am currently recursively describing the field details (by field number) for these. As far as I can tell, completely opaque structured (i.e., those that return #f for struct?) will give me the &#39;name&#39; of the structure type by using object-name. Any suggestions for describing structs and objects (and classes) would be welcome.<br>

<br>
What other first-class data object would be useful to include (parameters, which get described as procedures now, modules, units, signatures, processes, ...)?<br>
<br>
Thoughts, suggestions, comments, etc are welcome.<br>
<br>
The message with describe.ss attached was too big to post (I can send it separately if anyone wants to play with it), but here is some spew of the describe-test.ss file:<br>
<br>
--- Booleans ---<br>
#t is the Boolean true<br>
#f is the Boolean false<br>
<br>
--- Numbers ---<br>
+inf.0 is positive infinity<br>
-inf.0 is negative infinity<br>
+nan.0 is an inexact positive real number<br>
0 is the exact integer fixnum zero<br>
3628800 is the exact positive integer fixnum three million six hundred twenty-eight thousand eight hundred<br>
815915283247897734345611269596<br>
115894272000000000 is an exact positive integer eight hundred fifteen quattuordecillion nine hundred fifteen tredecillion two hundred eighty-three duodecillion two hundred forty-seven undecillion eight hundred ninety-seven decillion seven hundred thirty-four nonillion three hundred forty-five octillion six hundred eleven septillion two hundred sixty-nine sextillion five hundred ninety-six quintillion one hundred fifteen quadrillion eight hundred ninety-four trillion two hundred seventy-two billion<br>

-32636611329915909373824450783844635770880000000000 is an exact negative integer minus thirty-two quindecillion six hundred thirty-six quattuordecillion six hundred eleven tredecillion three hundred twenty-nine duodecillion nine hundred fifteen undecillion nine hundred nine decillion three hundred seventy-three nonillion eight hundred twenty-four octillion four hundred fifty septillion seven hundred eighty-three sextillion eight hundred forty-four quintillion six hundred thirty-five quadrillion seven hundred seventy trillion eight hundred eighty billion<br>

93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000 is an exact positive integer value whose absolute value is &gt;= 10^102<br>

3628800/39916801 is an exact positive rational number with a numerator of 3628800 and a denominator of 39916801<br>
-1+3i is an exact complex number whose magnitude is 3.1622776601683795<br>
0.0 is an inexact integer zero<br>
3628800.0 is an inexact positive integer<br>
8.159152832478977e+047 is an inexact positive integer<br>
3.1622776601683795 is an inexact positive real number<br>
0+3.1622776601683795i is an inexact positive imaginary number<br>
3.1622776601683795+3.1622776601683795i is an inexact complex number whose magnitude is 4.47213595499958<br>
<br>
--- Strings ---<br>
&quot;abc&quot; is an immutable string of length 3<br>
&quot;123&quot; is a mutable string of length 3<br>
<br>
--- Byte Strings ---<br>
#&quot;abc&quot; is an immutable byte string of length 3<br>
#&quot;012&quot; is a mutable byte string of length 3<br>
<br>
--- Characters ---<br>
#\a is the character whose code-point number is 97(#x61) and general category is &#39;ll (letter, lowercase)<br>
#\A is the character whose code-point number is 65(#x41) and general category is &#39;lu (letter, uppercase)<br>
#\0 is the character whose code-point number is 48(#x30) and general category is &#39;nd (number, decimal digit)<br>
#\( is the character whose code-point number is 40(#x28) and general category is &#39;ps (punctuation, open)<br>
<br>
--- Symbols ---<br>
abc is the interned symbol<br>
|(a + b)| is the interned symbol<br>
g1121 is an uninterned symbol<br>
<br>
--- Regular Expressions ---<br>
#rx&quot;Ap*le&quot; is a regular expression in regexp format<br>
#px&quot;Ap*le&quot; is a regular expression in pregexp format<br>
<br>
--- Byte Regular Expressions ---<br>
#rx#&quot;Ap*le&quot; is a byte regular expression in regexp format<br>
#px#&quot;Ap*le&quot; is a byte regular expression in pregexp format<br>
<br>
--- Keywords ---<br>
#:key is the keyword<br>
<br>
--- Lists and Pairs ---<br>
(this is a proper list) is a proper immutable list of length 5<br>
(this is an improper . list) is an improper immutable list<br>
((this . is) (also . a) (proper . list)) is a proper immutable list of length 3<br>
<br>
--- Mutable Lists and Pairs ---<br>
{this is a proper list} is a proper mutable list of length 5<br>
{this is an improper . list} is an improper mutable list<br>
{(this . is) (also . a) (proper . list)} is a proper mutable list of length 3<br>
<br>
--- Vectors ---<br>
#(1 2 3) is an immutable vector of length 3<br>
<br>
--- Boxes ---<br>
#&amp;12 is a box containing 12, 12 is the exact positive integer fixnum twelve<br>
#&amp;#&amp;a is a box containing #&amp;a, #&amp;a is a box containing a, a is the interned symbol<br>
#&amp;3.1622776601683795 is a box containing 3.1622776601683795, 3.1622776601683795 is an inexact positive real number<br>
<br>
--- Hashes ---<br>
#hash((c . 16) (b . 14) (a . 12)) is an immutable hash table and that uses equal? to compare keys<br>
  c : 16, 16 is the exact positive integer fixnum sixteen<br>
  b : 14, 14 is the exact positive integer fixnum fourteen<br>
  a : 12, 12 is the exact positive integer fixnum twelve<br>
#hasheq((c . c) (b . b) (a . a)) is an immutable hash table and that uses eq? to compare keys<br>
  c : c, c is the interned symbol<br>
  b : b, b is the interned symbol<br>
  a : a, a is the interned symbol<br>
#hasheqv((c . #\c) (b . #\b) (a . #\a)) is an immutable hash table and that uses eqv? to compare keys<br>
  c : #\c, #\c is the character whose code-point number is 99(#x63) and general category is &#39;ll (letter, lowercase)<br>
  b : #\b, #\b is the character whose code-point number is 98(#x62) and general category is &#39;ll (letter, lowercase)<br>
  a : #\a, #\a is the character whose code-point number is 97(#x61) and general category is &#39;ll (letter, lowercase)<br>
#hash((b . 14) (a . 12) (c . 16)) is a mutable hash table and that uses equal? to compare keys<br>
  b : 14, 14 is the exact positive integer fixnum fourteen<br>
  a : 12, 12 is the exact positive integer fixnum twelve<br>
  c : 16, 16 is the exact positive integer fixnum sixteen<br>
#&lt;hash&gt; is a mutable hash table that holds its keys weakly and that uses equal? to compare keys<br>
  c : 16, 16 is the exact positive integer fixnum sixteen<br>
  b : 14, 14 is the exact positive integer fixnum fourteen<br>
  a : 12, 12 is the exact positive integer fixnum twelve<br>
<br>
--- Procedures ---<br>
#&lt;procedure:car&gt; is a primitive procedure named car that accepts 1 argument and returns 1 result<br>
#&lt;procedure:open-output-file&gt; is a procedure named open-output-file that accepts 1 argument plus optional keyword arguments #:exists and #:mode<br>
#&lt;procedure:current-input-port&gt; is a primitive procedure named current-input-port that accepts 0 or 1 arguments and returns 1 result<br>
#&lt;procedure:...describe-test.ss:133:10&gt; is a procedure named ...describe-test.ss:133:10 that accepts 1 argument<br>
<br>
--- Void ---<br>
#&lt;void&gt; is void<br>
<br>
--- Structures ---<br>
#(struct:transparent-struct a b c) is a structure of type transparent-struct<br>
  1 : a, a is the interned symbol<br>
  2 : b, b is the interned symbol<br>
  3 : c, c is the interned symbol<br>
<br>
--- Other Named Things ---<br>
#&lt;opaque-struct&gt; is an object of type opaque-struct<br>
<br>
Doug<br></div></div>
------------------------------------------------------------------------<br>
<br>
_________________________________________________<br>
  For list-related administrative tasks:<br>
  <a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme" target="_blank">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>
  <br>
</blockquote>
<br>
</blockquote></div><br>