Share
Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.
Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.
Lost your password? Please enter your email address. You will receive a link and will create a new password via email.
Please briefly explain why you feel this question should be reported.
Please briefly explain why you feel this answer should be reported.
Please briefly explain why you feel this user should be reported.
parameterizeis used to have values that are “dynamically scoped”. You get a parameter withmake-parameter. The parameter itself behaves as a function: call it with no inputs and you get its value, call it with one value and it will set the value. For example:Many functions (including many primitive ones) use parameters as a way to customize their behavior. For example
printfwill print stuff using the port that is the value of thecurrent-output-portparameter. Now, say that you have some function that prints something:You usually call this function and see something printed on the screen — but in some cases you want to use it to print something to a file or whatever. You could do this:
One problem with this is that it is tedious to do — but that’s easily solved with a macro. (In fact, PLT still has a construct that does that in some languages:
fluid-let.) But there are more problems here: what happens if the call tofooresults in a runtime error? This might leave the system in a bad state, where all output goes to your port (and you won’t even see a problem, since it won’t print anything). A solution for that (whichfluid-letuses too) is to protect the saving/restoring of the parameter withdynamic-wind, which makes sure that if there’s an error (and more, if you know about continuations) then the value is still restored.So the question is what’s the point of having parameters instead of just using globals and
fluid-let? There are two more problems that you cannot solve with just globals. One is what happens when you have multiple threads — in this case, setting the value temporarily will affect other threads, which may still want to print to the standard output. Parameters solve this by having a specific value per-thread. What happens is that each thread “inherits” the value from the thread that created it, and changes in one thread are visible only in that thread.The other problem is more subtle. Say that you have a parameter with a numeric value, and you want to do the following:
In Scheme, “tail calls” are important — they are the basic tool for creating loops and much more.
parameterizedoes some magic that allows it to change the parameter value temporarily but still preserve these tail calls. For example, in the above case, you will get an infinite loop, rather than get a stack overflow error — what happens is that each of theseparameterizeexpressions can somehow detect when there’s an earlierparameterizethat no longer needs to do its cleanup.Finally,
parameterizeactually uses two important parts of PLT to do its job: it uses thread cells to implement per-thread values, and it uses continuation marks to be able to preserve tail-calls. Each of these features is useful in itself.