[racket] How to read procedure documentation?

From: Manfred Lotz (manfred.lotz at arcor.de)
Date: Fri Apr 19 15:15:09 EDT 2013

Hi Norman,
First, thanks to you and Asumu for your help.

On Fri, 19 Apr 2013 19:56:22 +0100
Norman Gray <norman at astro.gla.ac.uk> wrote:

> 
> Manfred, hello.
> 
> On 2013 Apr 19, at 19:18, Manfred Lotz wrote:
> 
> > I don't seem to know how to read procedure documentation like in the
> > following example.
> > 
> >    (file->string path [#:mode mode-flag]) → string?
> > 
> >  path : path-string?
> >  mode-flag : (or/c 'binary 'text) = 'binary
> > 
> > 
> > I would expect that the first parameter path is a string and that
> > the second parameter is an optional parameter denoting a file mode.
> > Further I would assume that file->string returns a string
> > containing the whole file.
> 
> The first argument to the function ('path') must satisfy the
> predicate 'path-string?'  Checking that procedure in the
> documentation[1] says "Return #t if v is either a path value for the
> current platform or a non-empty string without nul characters, #f
> otherwise."  That is, it can be a string filename, or a pre-composed
> version of that, a 'path', which is a structure which various
> procedures can operate on.  One could (I suppose) define path-string?
> as something like:
> 
>   (define (path-string? x) 
>     (or (path? x)
>         (string? x)))
> 
> The mode-flag argument is a 'contract'[2], which is sort-of like a
> predicate, but can be checked in a more thorough way (I'm omitting
> quite a lot of detail, here!).
> 
> So in contract terms, this bit of procedure documentation is saying
> that the file->string procedure obeys a contract where you can call
> it with an argument which satisfies path-string?, and optionally an
> argument which is either 'binary or 'text (and if you don't, the
> system will object on the procedure's behalf); and it contracts
> itself to produce a value which matches string? (and if it doesn't,
> the system will object on your behalf).
> 
> So yes, the summary you gave is pretty much accurate (except that you
> could give it a pre-composed 'path' value, as well).
> 
> Does this help at all?
> 

Yep, helped very much. Now I know that I have to understand a predicate
in place of a parameter as 'the parameter must satisfy the predicate'.
If I think further I recognize that scheme/racket isn't a statically
typed language, and thus giving a predicate as a constraint for a
parameter is on the one hand pretty flexible and on the other
hand much more powerful than specifying types which doesn't fit as good.

I also will read more about contracts.


-- 
Manfred




Posted on the users mailing list.