Review Questions
2. What does a lambda expression specify?
The
predicate function is often given as a lambda expression, which in ML
is defined exactly like a function, except with the fn reserved word,
instead of fun, and of course the lambda expression is nameless.
5. Explain why QUOTE is needed for a parameter that is a data list.
To
avoid evaluating a parameter, it is first given as a parameter to the
primitive function QUOTE, which simply returns it without change.
6. What is a simple list?
A list which membership of a given atom in a given list that does not include sublists.
7. What does the abbreviation REPL stand for?
REPL stand for read-evaluate-print loop.
11. What are the two forms of DEFINE?
The simplest form of DEFINE is one used to bind a name to the value of an expression. This form is
(DEFINE symbol expression)
The general form of such a DEFINE is
(DEFINE (function_name parameters)
(expression)
)
13. Why are CAR and CDR so named?
The names of
the CAR and CDR functions are peculiar at best. The origin of these
names lies in the first implementation of LISP, which was on an IBM 704
computer. The 704’s memory words had two fields, named decrement and
address, that were used in various operand addressing strategies. Each
of
these fields could store a machine memory address. The 704 also
included two machine instructions, also named CAR (contents of the
address part of a register) and CDR (contents of the decrement part of a
register), that extracted the associated fields. It was natural to use
the two fields to store the two pointers
of a list node so that a
memory word could neatly store a node. Using these conventions, the CAR
and CDR instructions of the 704 provided efficient list selectors. The
names carried over into the primitives of all dialects of LISP.
18. What is tail recursion? Why is it important to define
functions that use recursion to specify repetition to be tail recursive?
A
function is tail recursive if its recursive call is the last operation
in the function. This means that the return value of the recursive call
is the return value of the nonrecursive call to the function. It is
important to specify repetition to be tail recursive because it is more
efficient(increase the efficiency).
19. Why were imperative features added to most dialects of LISP?
LISP
began as a pure functional language but soon acquired some important
imperative features to increased its execution efficiency.
26. What is type inferencing, as used in ML?
Type
inference refers to the automatic deduction of the type of an
expression in a programming language. If some, but not all, type
annotations are already present it is referred to as type
reconstruction.
29. What is a curried function?
Curried functions a function which a new functions can be constructed from them by partial evaluation.
30. What does partial evaluation mean?
Partial
evaluation means that the function is evaluated with actual parameters
for one or more of the leftmost formal parameters.
32. What is the use of the evaluation environment table?
A
table called the evaluation environment stores the names of all
implicitly and explicitly declared identifiers in a program, along with
their types. This is like a run-time symbol table.
33. Explain the process of currying.
The process
of currying replaces a function with more than one parameter with a
function with one parameter that returns a function that takes the other
parameters of the initial function.
_______________________________________________________________________________________________________________________________
Problem Set
2 . Give a general form of function declaration in ML.
Function declarations in ML appear in the general form
fun function_name(formal parameters) = expression;
4. Refer to a book on Haskell programming and discuss the features of Haskell.
Haskell features lazy evaluation, pattern matching, list comprehension, type classes, and type polymorphism.
8. How is the functional operator pipeline (|>) used in F#?
The
pipeline operator is a binary operator that sends the value of its left
operand, which is an expression, to the last parameter of the function
call, which is the right operand.
9. What does the following Scheme function do?
(define (y s lis)
(cond
((null? lis) ‘() )
((equal? s (car lis)) lis)
(else (y s (cdr lis)))
))
y
returns the given list with leading elements removed up to but not
including the first occurrence of the first given parameter.
10. What does the following Scheme function do?
(define (x lis)
(cond
((null? lis) 0)
((not (list? (car lis)))
(cond
((eq? (car lis) #f) (x (cdr lis)))
(else (+ 1 (x (cdr lis))))))
(else (+ (x (car lis)) (x (cdr lis))))
x returns the number of non-NIL atoms in the given list.
No comments:
Post a Comment