- 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: (e1,e2) ( e 1 , e 2 )
⋅ ⋅ Evaluation: Evaluate e1 e 1 to v1 v 1 and e2 e 2 to v2 v 2 ;result is (v1,v2) ( v 1 , v 2 ) . A pair of value is a value.
⋅ ⋅ Type-checking: If e1 e 1 has type ta and e2 e 2 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:
[v1,v2,...,vn] [ v 1 , v 2 , . . . , v n ] .
(3)If e1 e 1 evaluates to v v and e2 e 2 evaluates to a list [v1,...,vn] [ v 1 , . . . , v n ] ,
then e1::e2 e 1 :: e 2 evaluates to [v,v1...,vn] [ v , v 1 . . . , v n ] . - Accessing Lists
Until we learn pattern-matching, we will use three standard-library functions.
⋅ ⋅ null e e evaluates to true if and only if evaluates to [].
⋅ ⋅ is e e evaluates to then hd(head) e e evaluates to .
⋅ ⋅ If e e evaluates to then tl(tail) e e 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 e1::e2 e 1 :: e 2 to type-check, we need a t such that e1 e 1 has type t and e2 e 2 has type t list. Then the result type is t list. Let-expressions
3 questions :
⋅ ⋅ Syntax: let b1,b2...bn b 1 , b 2 . . . b n int e e end
(1) Each is any bingding and e e is any expression
(2)Type-checking: Type-check each and e e in a static environment that includes the previous bindings.
Type of whole let-expression is the type of
(3) Evaluation: Evaluate each bi b i and e e 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
e1 e 1 andalso e2 e 2
⋅ ⋅ Type-checking: e1 e 1 and e2 e 2 must have type bool
⋅ ⋅ Evaluation: If result of e1 e 1 is false then false else result of e2 e 2
e1 e 1 orelse e2 e 2 , not e1 e 1 - 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)
最新推荐文章于 2022-05-09 23:24:27 发布