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



On Jan 4, 2014, at 4:57 PM, Rian Shams wrote:

> Thanks Matthias,
> 
> If I use your definition:
> 
> (define (select-random-safe-function)
>   (object-name 
>    (list-ref safe-function-set (random (length safe-function-set)))))
> 
> then,
> 
> >(procedure-arity (select-random-safe-function)) 
> error:procedure-arity: contract violation
>   expected: procedure?
>   given: '$+
> 
> 
> I believe I need two things:
>  
> 1. (select-random-safe-function) should return an unquoted procedure, similar 
> to 
> 
> (define (select-random-safe-function) ;without object-name
>    (list-ref safe-function-set (random (length safe-function-set)))) 
> >(select-random-safe-function)
> #<procedure:$+>
> 
> preferably without #<procedure: $+ >
> 
> so my problem is that I want the output to display 
> $+
> instead of
> #<procedure:$+>
> 
> 2. The reason the procedure needs to be unquoted is because 
> (procedure-arity (select-random-safe-function)) will produce an error if the 
> function is quoted.
> 
> 
> 
> 
> Later on I use both (procedure-arity (select-random-safe-function)) and 
> (select-random-safe-function) in a main function:
> 
> ;;Generate Initial Population
> ;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
> 
> (define (generate-initial-population population-size) 
>   (cond [(zero? population-size) empty]
>            [else (cons (generate-chromosome initial-chromosome-depth) 
> ;initial-chromosome-depth is 3
>                             (generate-initial-population (sub1 
> population-size)))]))
> 
> > (generate-initial-population 1) 
> '((#<procedure:$/> (#<procedure:$-> x .234) (#<procedure:$+> .576 x)))
> 
> 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 
> 
> '(($/ ($- x .234) ($+ .576 x))) 
> 
> instead of
> 
> '((#<procedure:$/> (#<procedure:$-> x .234) (#<procedure:$+> .576 x)))
> 
> and I am not sure how I would go about doing this?
> 
> On Sat, Jan 4, 2014 at 8:45 AM, Matthias Felleisen <matth...@ccs.neu.edu> 
> wrote:
> 
> If you really just want the name, use object-name: 
> 
> (define (select-random-safe-function)
>   (object-name 
>    (list-ref safe-function-set (random (length safe-function-set)))))
> 
> Welcome to DrRacket, version 6.0.0.1--2013-12-29(bbb0c5f6/d) [3m].
> Language: racket.
> > (select-random-safe-function)
> '$*
> 
> 
> 
> 
> On Jan 4, 2014, at 2:48 AM, Rian Shams wrote:
> 
>> If I do this I get the results I need for (procedure-arity 
>> (select-random-safe-function)), but when I call 
>> (safe-function-set) or (select-random-safe-function) or any other function 
>> that returns a safe function I get for example:
>> 
>> >(safe-function-set)
>> '(#<procedure:$+> #<procedure:$-> #<procedure:$*> #<procedure:$/>)
>> 
>> >(select-random-safe-function) 
>> #<procedure:$->
>> 
>> whereas when it was defined using quote as opposed to list I get:
>> 
>> >(safe-function-set)
>> '($+ $- $* $/)
>> 
>> >(select-random-safe-function) 
>> '$-
>> 
>> 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))?
>> 
>> Best,
>> 
>> 
>> On Fri, Jan 3, 2014 at 5:31 PM, Sam Tobin-Hochstadt <sa...@cs.indiana.edu> 
>> wrote:
>> Try replacing `safe-function-set` with:
>> 
>> (define safe-function-set (list $+ $- $* $/))
>> 
>> Sam
>> 
>> On Fri, Jan 3, 2014 at 5:28 PM, Rian Shams <rian.sh...@gmail.com> wrote:
>> > Hello,
>> >
>> > I am working with functions that I have defined to only take 1 or 2 
>> > operands
>> > (called safe-functions) for the implementation of a genetic program.
>> >
>> > (define ($+ augend addend) ;operation is addition
>> >   (+ augend addend)) ; the result is the sum
>> > (define ($- minuend subtrahend) ;operation is subtraction
>> >   (- minuend subtrahend)) ;result is difference
>> > (define ($* multiplicand multiplier) ;operation is multiplication
>> >   (* multiplicand multiplier)) ;result is product
>> > (define ($/ dividend divisor) ;operation is division
>> >   (/ dividend divisor)) ;result is quotient
>> >
>> > (define (infinity? x) (or (eq? x +Inf.0) (eq? x -Inf.0)))
>> > (define ($sin x) (if (infinity? x) (* (sgn x) +Inf.0) (sin x)))
>> > (define ($cos x) (if (infinity? x) (* (sgn x) +Inf.0) (cos x)))
>> >
>> > (define safe-function-set
>> >   '($+
>> >     $-
>> >     $*
>> >     $/
>> >     ;$sin
>> >     ;$cos))
>> >
>> > (define (select-random-safe-function)
>> >   (list-ref safe-function-set (random (length safe-function-set))))
>> >
>> > I would like to use procedure-arity (or a similar function) to determine 
>> > the
>> > arity of a randomly selected safe function but I get this error:
>> >
>> >>(procedure-arity (select-random-safe-function))
>> > error: procedure-arity: contract violation
>> >   expected: procedure?
>> >   given: '$+
>> >
>> > I think the problem is that the safe-functions are passed to 
>> > procedure-arity
>> > quoted. Is there a way I can unquote the functions, or adjust
>> > procedure-arity to make (procedure-arity (select-random-safe-function))
>> > work?
>> >
>> > Thanks,
>> > --
>> > Rian Shams
>> >
>> > ____________________
>> >   Racket Users list:
>> >   http://lists.racket-lang.org/users
>> >
>> 
>> 
>> 
>> -- 
>> Rian Shams
>> ____________________
>>  Racket Users list:
>>  http://lists.racket-lang.org/users
> 
> 
> 
> 
> -- 
> Rian Shams

____________________
  Racket Users list:
  http://lists.racket-lang.org/users

Reply via email to