CSE 341: Programming Languages Section 1

Slides:



Advertisements
Similar presentations
Programming Languages Section 1 1 Programming Languages Section 1. SML Fundamentals Xiaojuan Cai Spring 2015.
Advertisements

CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Winter 2013.
Introduction to ML – Part 1 Kenny Zhu. Assignment 2 chive/fall07/cos441/assignments/a2.ht m
Today’s Agenda ML Development Workflow –Emacs –Using use –The REPL More ML –Shadowing Variables –Debugging Tips –Boolean Operations –Comparison Operations.
Programming Languages Dan Grossman 2013 ML Expressions and Variable Bindings.
IST 210: PHP Logic IST 210: Organization of Data IST2101.
CMSC201 Computer Science I for Majors Lecture 05 – Comparison Operators and Boolean (Logical) Operators Prof. Katherine Gibson Prof. Jeremy.
Programming Languages Dan Grossman 2013
CMSC201 Computer Science I for Majors Lecture 05 – Comparison Operators and Boolean (Logical) Operators Prof. Katherine Gibson Based on slides by Shawn.
CSE341: Programming Languages Lecture 11 Type Inference
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Winter 2013.
Programming Languages Dan Grossman 2013
CSE 341 Section 1 (9/28) With thanks to Dan Grossman, et. al. from previous versions of these slides.
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE 341 Section 1 (9/28) With thanks to Dan Grossman, et. al. from previous versions of these slides.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Spring 2017.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Winter 2013.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Spring 2017.
CSE341: Programming Languages Lecture 16 Datatype-Style Programming With Lists or Structs Dan Grossman Spring 2013.
Nicholas Shahan Spring 2016
CSE341: Programming Languages Lecture 15 Macros
CSE 341: Programming Languages Section 1
CSE 341: Programming Langs
CSE341: Programming Languages Section 1
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Winter 2013.
CSE 341 Section 1 Nick Mooney Spring 2017
CSE341: Programming Languages Section 1
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2013.
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Spring 2013.
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Winter 2018.
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 7 First-Class Functions
Loops CIS 40 – Introduction to Programming in Python
CSE 341 Section 2 Winter 2018 Adapted from slides by Nick Mooney, Nicholas Shahan, Patrick Larson, and Dan Grossman.
Coding Concepts (Basics)
CSE341: Programming Languages Lecture 15 Macros
CSE 341 Section 5 Winter 2018.
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Autumn 2018.
CSE341: Programming Languages Lecture 11 Type Inference
Winter 2018 With thanks to: Dan Grossman / Eric Mullen
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Winter 2018.
Spencer Pearson Spring 2017
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Spring 2016.
CSE341: Programming Languages Lecture 15 Macros
Dan Grossman / Eric Mullen Autumn 2017
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE341: Programming Languages Lecture 11 Type Inference
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Spring 2019.
CSE341: Programming Languages Lecture 11 Type Inference
CSE341: Programming Languages Lecture 3 Local Bindings; Options; Benefits of No Mutation Dan Grossman Autumn 2017.
CSE341: Programming Languages Lecture 4 Records, Datatypes, Case Expressions Dan Grossman Spring 2019.
Programming Languages Dan Grossman 2013
CSE341: Programming Languages Lecture 8 Lexical Scope and Function Closures Dan Grossman Spring 2019.
CSE341: Programming Languages Section 1
Brett Wortzman Summer 2019 Slides originally created by Dan Grossman
Brett Wortzman Summer 2019 Slides originally created by Dan Grossman
CSE341: Programming Languages Lecture 7 First-Class Functions
CSE341: Programming Languages Lecture 11 Type Inference
CSE341: Programming Languages Lecture 15 Macros
CSE341: Programming Languages Lecture 15 Macros
Presentation transcript:

CSE 341: Programming Languages Section 1 Spencer Pearson (Thu 9:30-10:30, CSE 220) Thanks to Dan Grossman, Konstantin Weitz, Josiah Adams, and Cody A. Schroeder for the majority of this content

Today’s Agenda ML Development Workflow The REPL (Read–Eval–Print Loop) Emacs Using use More ML Shadowing Variables Debugging Comparison Operations Boolean Operations Testing

The REPL Read-Eval-Print-Loop is well named Useful for quickly trying things out (but save code for reuse by putting it in a .sml file) Expects semicolons (P.S.: rlwrap might be useful.) Demo agenda: basic expressions it You’ve seen this in lecture, but now’s a great time to ask questions

Emacs Demo Recommended (not required) editor for this course Powerful, but the learning curve can at first be intimidating Why Emacs? It runs on everything. It runs over SSH Plugins for every language Demo Topics Note: Installation instructions & guide found on course website Control and Meta keys Navigation, Search (Just like Bash and many other REPLs!) Cut / Copy / Paste Ctrl-G SML Open / Save / Close

Using use use "foo.sml"; Enters bindings from the file foo.sml Like typing the variable bindings one at a time in sequential order into the REPL (more on this in a moment) Result is () bound to variable it Ignorable It’s dangerous to reuse use without restarting the REPL session! Definitions linger.

Debugging Errors Your mistake could be: Syntax: What you wrote means nothing or not the construct you intended Type-checking: What you wrote does not type-check Evaluation: It runs but produces wrong answer, or an exception, or an infinite loop Work on developing resilience to mistakes: Slow down Don’t panic Read what you wrote very carefully Preventative medicine: testing! The error messages you get is just ML’s best guess at the problem. It’s up to you to ultimately diagnose and fix. ML’s error messages leave something to be desired.

Shadowing of Variable Bindings val a = 1; (* a -> 1 *) val b = a; (* a -> 1, b -> 1 *) val a = 2; (* a -> 2, b -> 1 *) Expressions in variable bindings are evaluated “eagerly” Before the variable binding “finishes” Afterwards, the expression producing the value is irrelevant Multiple variable bindings to the same variable name, or “shadowing”, is allowed but discouraged When looking up a variable, ML uses the latest binding by that name in the current environment Remember, there is no way to “assign to” a variable in ML Can only shadow it in a later environment After binding, a variable’s value is an immutable constant NOTE: relationship between variable bindings and the environment (Emphasize this now to lay the foundation for first-class functions)

Try to Avoid Shadowing val x = "Hello World"; val x = 2; (* is this a type error? *) val res = x * 2; (* is this 4 or a type error? *) Shadowing can be confusing and is often poor style Why? Reintroducing variable bindings in the same REPL session may.. make it seem like wrong code is correct; or make it seem like correct code is wrong.

Using a Shadowed Variable Is it ever possible to use a shadowed variable? Yes! And no… It can be possible to uncover a shadowed variable when the latest binding goes out of scope val threshold = 10; (* threshold -> 10 *) fun is_big(x : int) = x > threshold; (* threshold -> 10, is_big -> (function) *) val threshold = 20; (* threshold -> 20, is_big -> (function) *) val z = is_big 15;

Use use Wisely Warning: Variable shadowing makes it dangerous to call use more than once without restarting the REPL session. It may be fine to repeatedly call use in the same REPL session, but unless you know what you’re doing, be safe! Ex: loading multiple distinct files (with independent variable bindings) at the beginning of a session use’s behavior is well-defined, but even expert programmers can get confused Restart your REPL session before repeated calls to use

= <> > < >= <= Comparisons For comparing int values: = <> > < >= <= You might see weird error messages because comparators can be used with some other types too: > < >= <= can be used with real, but not 1 int and 1 real = <> can be used with any “equality type” but not with real Let’s not discuss equality types yet

Boolean Operations andalso e1 andalso e2 orelse e1 orelse e2 not Syntax Type-checking Evaluation andalso e1 andalso e2 e1 and e2 must have type bool Same as Java’s e1 && e2 orelse e1 orelse e2 Same as Java’s e1 || e2 not not e1 e1 must have type bool Same as Java’s !e1 not is just a pre-defined function, but andalso and orelse must be built-in operations since they cannot be implemented as a function in ML. Why? Be careful to always use andalso instead of and. and is different. We will get back to it later. andalso and orelse “short-circuit” their evaluation and may not evaluate both e1 and e2.

Testing Write tests for your code! val test1 = (abs 2 = 2);