<div dir="ltr">Perfect, I didn't know structs could be used like that.<div>Thank you!</div><div><br></div><div>As a follow-up question, can you directly create functions with a custom printing method, without having to go through structs?</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Sat, Jan 4, 2014 at 8:13 PM, Vincent St-Amour <span dir="ltr"><<a href="mailto:stamourv@ccs.neu.edu" target="_blank">stamourv@ccs.neu.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Similarly, you can represent safe functions as applicable structures (so<br>
they can behave like functions) with a custom printing method.<br>
<br>
    #lang racket<br>
<br>
    (struct safe-function (f name)<br>
            #:property prop:procedure 0 ; first field is the function<br>
            #:methods gen:custom-write<br>
            [(define (write-proc safe-function port mode)<br>
               (display (safe-function-name safe-function) port))])<br>
<br>
    (define $+ (safe-function + '$+))<br>
<br>
    ($+ 1 2) ; => 3<br>
    $+ ; prints "$+"<br>
<br>
<br>
Vincent<br>
<br>
<br>
<br>
At Sat, 4 Jan 2014 18:52:55 -0500,<br>
Matthias Felleisen wrote:<br>
><br>
> [1  <multipart/alternative (7bit)>]<br>
> [1.1  <text/plain; iso-8859-1 (quoted-printable)>]<br>
<div><div class="h5">><br>
> Perhaps you want something like this:<br>
><br>
> Welcome to Racket v6.0.0.1.<br>
> > (current-print (lambda (x) (if (procedure? x) (printf "~a" (object-name x)) (print x)) (newline)))<br>
> #<void><br>
> > +<br>
> +<br>
> > 10<br>
> 10<br>
><br>
><br>
><br>
><br>
> On Jan 4, 2014, at 6:40 PM, Rian Shams wrote:<br>
><br>
> > Sorry for my lack of clarity.<br>
> ><br>
> > My question is about the output that is displayed from calling the function. For example, evaluating just<br>
> ><br>
> > >$+<br>
> > #<procedure:$+><br>
> ><br>
> > The result I am looking for is<br>
> ><br>
> > >$+<br>
> > $+<br>
> ><br>
> > as opposed to<br>
> > #<procedure:$+><br>
> ><br>
> > I am not sure whether this is just a formatting or renaming problem, or if it is possible to change what the interpreter displays in Dr.Racket?<br>
> ><br>
> > I am fairly new to Racket and programming in general and so I really appreciate your responses and patience.<br>
> ><br>
> ><br>
> > On Sat, Jan 4, 2014 at 5:49 PM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>> wrote:<br>
> ><br>
> > Yes, you need two functions: one that gives you the name of a procedure and one that picks a procedure. I was merely hinting at how to do the former. -- Matthias<br>
> ><br>
> ><br>
> ><br>
> > On Jan 4, 2014, at 4:57 PM, Rian Shams wrote:<br>
> ><br>
> >> Thanks Matthias,<br>
> >><br>
> >> If I use your definition:<br>
> >><br>
> >> (define (select-random-safe-function)<br>
> >>   (object-name<br>
> >>    (list-ref safe-function-set (random (length safe-function-set)))))<br>
> >><br>
> >> then,<br>
> >><br>
> >> >(procedure-arity (select-random-safe-function))<br>
> >> error:procedure-arity: contract violation<br>
> >>   expected: procedure?<br>
> >>   given: '$+<br>
> >><br>
> >><br>
> >> I believe I need two things:<br>
> >><br>
> >> 1. (select-random-safe-function) should return an unquoted procedure, similar to<br>
> >><br>
> >> (define (select-random-safe-function) ;without object-name<br>
> >>    (list-ref safe-function-set (random (length safe-function-set))))<br>
> >> >(select-random-safe-function)<br>
> >> #<procedure:$+><br>
> >><br>
> >> preferably without #<procedure: $+ ><br>
> >><br>
> >> so my problem is that I want the output to display<br>
> >> $+<br>
> >> instead of<br>
> >> #<procedure:$+><br>
> >><br>
> >> 2. The reason the procedure needs to be unquoted is because<br>
> >> (procedure-arity (select-random-safe-function)) will produce an error if the function is quoted.<br>
> >><br>
> >><br>
> >><br>
> >><br>
> >> Later on I use both (procedure-arity (select-random-safe-function)) and (select-random-safe-function) in a main function:<br>
> >><br>
> >> ;;Generate Initial Population<br>
> >> ;population size is a positive integer and the auxiliary-function, generate-chromsome generates a tree using functions from safe-function-set and terms (numbers and symbols) from a term-set<br>
> >><br>
> >> (define (generate-initial-population population-size)<br>
> >>   (cond [(zero? population-size) empty]<br>
> >>            [else (cons (generate-chromosome initial-chromosome-depth) ;initial-chromosome-depth is 3<br>
> >>                             (generate-initial-population (sub1 population-size)))]))<br>
> >><br>
> >> > (generate-initial-population 1)<br>
> >> '((#<procedure:$/> (#<procedure:$-> x .234) (#<procedure:$+> .576 x)))<br>
> >><br>
> >> this gets me my desired result, but is hard for me to read especially as the depth and population size grows (typically I will be working with populations ranging in the hundreds or thousands and each chromosome/tree's depth could easily exceed 10) so it would be more convenient here if my solution displays<br>

> >><br>
> >> '(($/ ($- x .234) ($+ .576 x)))<br>
> >><br>
> >> instead of<br>
> >><br>
> >> '((#<procedure:$/> (#<procedure:$-> x .234) (#<procedure:$+> .576 x)))<br>
> >><br>
> >> and I am not sure how I would go about doing this?<br>
> >><br>
> >> On Sat, Jan 4, 2014 at 8:45 AM, Matthias Felleisen <<a href="mailto:matthias@ccs.neu.edu">matthias@ccs.neu.edu</a>> wrote:<br>
> >><br>
> >> If you really just want the name, use object-name:<br>
> >><br>
> >> (define (select-random-safe-function)<br>
> >>   (object-name<br>
> >>    (list-ref safe-function-set (random (length safe-function-set)))))<br>
> >><br>
> >> Welcome to DrRacket, version 6.0.0.1--2013-12-29(bbb0c5f6/d) [3m].<br>
> >> Language: racket.<br>
> >> > (select-random-safe-function)<br>
> >> '$*<br>
> >><br>
> >><br>
> >><br>
> >><br>
> >> On Jan 4, 2014, at 2:48 AM, Rian Shams wrote:<br>
> >><br>
> >>> If I do this I get the results I need for (procedure-arity (select-random-safe-function)), but when I call<br>
> >>> (safe-function-set) or (select-random-safe-function) or any other function that returns a safe function I get for example:<br>
> >>><br>
> >>> >(safe-function-set)<br>
> >>> '(#<procedure:$+> #<procedure:$-> #<procedure:$*> #<procedure:$/>)<br>
> >>><br>
> >>> >(select-random-safe-function)<br>
> >>> #<procedure:$-><br>
> >>><br>
> >>> whereas when it was defined using quote as opposed to list I get:<br>
> >>><br>
> >>> >(safe-function-set)<br>
> >>> '($+ $- $* $/)<br>
> >>><br>
> >>> >(select-random-safe-function)<br>
> >>> '$-<br>
> >>><br>
> >>> How would I get rid of this #<procedure:$-> part for readability, keeping only the $- part which is the actual function I defined, while still keeping it a function/procedure that gives me the function arity using (procedure-arity (select-random-safe-function))?<br>

> >>><br>
> >>> Best,<br>
> >>><br>
> >>><br>
> >>> On Fri, Jan 3, 2014 at 5:31 PM, Sam Tobin-Hochstadt <<a href="mailto:samth@cs.indiana.edu">samth@cs.indiana.edu</a>> wrote:<br>
> >>> Try replacing `safe-function-set` with:<br>
> >>><br>
> >>> (define safe-function-set (list $+ $- $* $/))<br>
> >>><br>
> >>> Sam<br>
> >>><br>
> >>> On Fri, Jan 3, 2014 at 5:28 PM, Rian Shams <<a href="mailto:rian.shams@gmail.com">rian.shams@gmail.com</a>> wrote:<br>
> >>> > Hello,<br>
> >>> ><br>
> >>> > I am working with functions that I have defined to only take 1 or 2 operands<br>
> >>> > (called safe-functions) for the implementation of a genetic program.<br>
> >>> ><br>
> >>> > (define ($+ augend addend) ;operation is addition<br>
> >>> >   (+ augend addend)) ; the result is the sum<br>
> >>> > (define ($- minuend subtrahend) ;operation is subtraction<br>
> >>> >   (- minuend subtrahend)) ;result is difference<br>
> >>> > (define ($* multiplicand multiplier) ;operation is multiplication<br>
> >>> >   (* multiplicand multiplier)) ;result is product<br>
> >>> > (define ($/ dividend divisor) ;operation is division<br>
> >>> >   (/ dividend divisor)) ;result is quotient<br>
> >>> ><br>
> >>> > (define (infinity? x) (or (eq? x +Inf.0) (eq? x -Inf.0)))<br>
> >>> > (define ($sin x) (if (infinity? x) (* (sgn x) +Inf.0) (sin x)))<br>
> >>> > (define ($cos x) (if (infinity? x) (* (sgn x) +Inf.0) (cos x)))<br>
> >>> ><br>
> >>> > (define safe-function-set<br>
> >>> >   '($+<br>
> >>> >     $-<br>
> >>> >     $*<br>
> >>> >     $/<br>
> >>> >     ;$sin<br>
> >>> >     ;$cos))<br>
> >>> ><br>
> >>> > (define (select-random-safe-function)<br>
> >>> >   (list-ref safe-function-set (random (length safe-function-set))))<br>
> >>> ><br>
> >>> > I would like to use procedure-arity (or a similar function) to determine the<br>
> >>> > arity of a randomly selected safe function but I get this error:<br>
> >>> ><br>
> >>> >>(procedure-arity (select-random-safe-function))<br>
> >>> > error: procedure-arity: contract violation<br>
> >>> >   expected: procedure?<br>
> >>> >   given: '$+<br>
> >>> ><br>
> >>> > I think the problem is that the safe-functions are passed to procedure-arity<br>
> >>> > quoted. Is there a way I can unquote the functions, or adjust<br>
> >>> > procedure-arity to make (procedure-arity (select-random-safe-function))<br>
> >>> > work?<br>
> >>> ><br>
> >>> > Thanks,<br>
> >>> > --<br>
> >>> > Rian Shams<br>
> >>> ><br>
> >>> > ____________________<br>
> >>> >   Racket Users list:<br>
> >>> >   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
> >>> ><br>
> >>><br>
> >>><br>
> >>><br>
> >>> --<br>
> >>> Rian Shams<br>
> >>> ____________________<br>
> >>>  Racket Users list:<br>
> >>>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
> >><br>
> >><br>
> >><br>
> >><br>
> >> --<br>
> >> Rian Shams<br>
> ><br>
> ><br>
> ><br>
> ><br>
> > --<br>
> > Rian Shams<br>
><br>
</div></div>> [1.2  <text/html; iso-8859-1 (7bit)>]<br>
><br>
> [2  <text/plain; us-ascii (7bit)>]<br>
<div class="HOEnZb"><div class="h5">> ____________________<br>
>   Racket Users list:<br>
>   <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br>Rian Shams
</div>