- Syntax:
if e1 then e2 else e3
where if ,then, and else are keywords and
e1, e2, and e3 are subexpressions
Type-checking:
first e1 must have type bool
e1 and e3 can have any type(let’s call it t) ,but they must have the type t
the type of the entire expression is also t;
Evaluation rules:
first evaluate e1 to a value call it v1
if it’s true, evaluate e2 and that result is the whole expression’s result
else, evaluate e3 and that result is the whole expression’s result - The REPL
(1)Read-Eval-Print-Loop is well named
(2)Can just treat it as a strange/convenient way to run programs
But more convenient for quick try-something-out
Then move things over to a testing file for easy reuse
(3)For reasons discussed in next segment, do not use ‘use ’ without restarting the REPL session
(But using it for multiple files at beginning of sessions is okay) - Tuples and lists
So far: numbers, booleans, conditionals,variables, functions
Now ways to build up data with multiple parts.
This is essential
Java examples: classes with fields, arrays.
Now:
Tuples: fixed “number of pieces” that may have different types.
Coming soon:
Lists: any “number of pieces” that all have the same type.
Later:
Other more general ways to create compound data.
3.1 Pairs(2-tuples)
Need a way to build pairs and a way to access the pieces.
(1)Build:
Syntax:
Evaluation: Evaluate to and to ;result is . A pair of value is a value.
Type-checking: If has type ta and has type tb,then the pair experssion has type ta * tb. A new kind of type.
(2) Access:
Syntax: #1 e and #2 e
Evaluation: Evaluate e to a pair of values and return first or second piece.
: Example: If e is a varible x,then look up x in environment.
: Type-checking:If e has type ta * tb, then #1 e has type ta.
and #2 e has type tb.
(3) Nesting
Pairs and tuples can nested however you want.
Not a new feature: implied by the syntax and semantics
val x1 = (7, (true, 9)) (* int * (bool * int ) *)
val x2 = #1 (#2 x1) (* bool *)
val x3 = (#2 x1) (* bool * int * )
val x4 = ((3,5), ((4,8), (0, 0) ) )
( * (int * int ) * ((int * int ) * (int * int)) *) - Lists
Despite nested tuples, the type of a varible still “commits” to a particular “amount” of data.
In contract, a list:
Can have any number of elements
But all list elements have the same type.
4.1 Building Lists
(1) The empty list is a value: [ ]
(2)In general, a list of values is a value; elements separated by commas:
.
(3)If evaluates to and evaluates to a list ,
then evaluates to . - Accessing Lists
Until we learn pattern-matching, we will use three standard-library functions.
null evaluates to true if and only if evaluates to [].
is evaluates to then hd(head) evaluates to .
If evaluates to then tl(tail) evaluates to
(raise exception if e evaluates to [])
(Notice result is a list)
5.1 Type-checking list operations.
(1) Lots of new types: For any type t ,the type t list describes lists where all elements have type t;
(2) So [] can have type t list for an type.SML uses type ‘a list to indicate this (“quate a” or “alpha”).
(3) For to type-check, we need a t such that has type t and has type t list. Then the result type is t list. Let-expressions
3 questions :
Syntax: let int end
(1) Each is any bingding and is any expression
(2)Type-checking: Type-check each and in a static environment that includes the previous bindings.
Type of whole let-expression is the type of
(3) Evaluation: Evaluate each and in a dynamic environment that includes the previous bindings.
Result of whole let-expression is result of evaluating .Options
(1) t option is a type for any type t
( much like t list , but a different type, not a list)
(2) Building:
NONE has type ‘a option (much like [] has type ‘a list)
SOME e has type t option if e has type t (much like e:: [])
(3) Accessing:
isSome has type ‘a option ->bool
valOf has type ‘a option ->’a (exception if given NONE)- Boolean operations
andalso
Type-checking: and must have type bool
Evaluation: If result of is false then false else result of
orelse , not - Comparisons
For comparing int values:
can be used with real, but not 1 int and 1 real
=, <> can be used with any “equality type “but not with real
Programming language--week1(sml)
猜你喜欢
转载自blog.csdn.net/qq_31805127/article/details/80138360
今日推荐
周排行