This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
cs330_f2016:rackethof2 [2016/09/12 20:46] morse |
cs330_f2016:rackethof2 [2018/01/23 16:05] morse [Notes:] |
||
---|---|---|---|
Line 14: | Line 14: | ||
For this lab, you will need to implement the following decorator functions in Racket: | For this lab, you will need to implement the following decorator functions in Racket: | ||
- | * ''check-parms'' - decorates a function to enforce parameter type checking | ||
* ''default-parms'' - decorates a function to add default parameter values | * ''default-parms'' - decorates a function to add default parameter values | ||
+ | * ''type-parms'' - decorates a function to enforce parameter type checking | ||
You will also chain these together to add both parameter type checking and default parameters to a function. | You will also chain these together to add both parameter type checking and default parameters to a function. | ||
Line 43: | Line 43: | ||
(define g (type-parms f (list number? string?)) | (define g (type-parms f (list number? string?)) | ||
</code> | </code> | ||
- | would result in a function ''g'' such that ''(g 0 "hello")'' behaves just like ''(f 0 "hello")'', but passing anything but a number for the first parameter or anything other than a string for the second parameter results in an error message. | + | would result in a function ''g'' such that ''(g 0 "hello")'' behaves just like ''(f 0 "hello")'', but passing anything but a number for the first parameter or anything other than a string for the second parameter results in an error message, by calling ``(error "ERROR MSG")``. |
Hint: You may want to write a small helper function that takes a list of values and a list of type predicates, then makes sure each of the values satisfies the respective type predicate. This is straightforward to write recursively. Can you write it in shorter form by mapping a two-parameter function pairwise on the lists? | Hint: You may want to write a small helper function that takes a list of values and a list of type predicates, then makes sure each of the values satisfies the respective type predicate. This is straightforward to write recursively. Can you write it in shorter form by mapping a two-parameter function pairwise on the lists? | ||
Line 55: | Line 55: | ||
<code racket> | <code racket> | ||
(define g (default-parms | (define g (default-parms | ||
- | (type-parms f | + | (type-parms |
- | (list number? string?)) | + | f |
- | (list 0 ""))) | + | (list number? string?)) |
+ | (list 0 ""))) | ||
</code> | </code> | ||
would result in a function ''g'' that fills in any missing parameters with ''0'' and ''""'' respectively, and then verifies that the passed parameters are a number and a string. | would result in a function ''g'' that fills in any missing parameters with ''0'' and ''""'' respectively, and then verifies that the passed parameters are a number and a string. | ||
Line 71: | Line 72: | ||
You again **do not** need to bulletproof the code to enforce proper inputs. | You again **do not** need to bulletproof the code to enforce proper inputs. | ||
Your code only needs to return correct values given correct inputs. | Your code only needs to return correct values given correct inputs. | ||
+ | (Note: catching incorrectly typed inputs is part of the specified functionality for the type-checking decorator, so you should specifically detect and report that type of error.) | ||
---- | ---- | ||
Line 76: | Line 78: | ||
====Hints:==== | ====Hints:==== | ||
- | For both of your decorators, they have the same basic form: | + | Remember from class that our decorators have the same basic form: |
<code racket> | <code racket> | ||
(define (<name of the decorator> f ...) | (define (<name of the decorator> f ...) | ||
Line 83: | Line 85: | ||
(apply f args))) | (apply f args))) | ||
</code> | </code> | ||
- |