250 likes | 271 Views
Learn Lisp basics through Dr.Scheme, an interpreted language known for its functional style and prefix operator notation using parentheses. Covering atoms, lists, math functions, variables, and flow of control, it provides a solid foundation for understanding Lisp. Experiment with defining functions, using predicates, lists, list construction functions, and more. Begin your journey with the essentials of Lisp programming!
E N D
Scheme A “small” variant of Lisp
Basics • Why Lisp? • Learning lisp in the study of AI is like learning French if you are going to France (Charniak & McDermot) • Interpreted language • Prefix operator notation, with parentheses • Functional style
Overview • Dr Scheme • Atoms & Lists • Functions: Math & predicates • Constants: Quoting • More functions: List construction • Defining variables • Flow of control • Defining functions
Dr. Scheme • See web site for downloads • Has different language levels: • “Language” • “Choose Language” • “Full Scheme” • Two windows • Top: program editing (“definitions”) window • Define functions, variables, comments • Bottom: interactive evaluation window: interpreted • Evaluate functions, test code
Atoms & Lists • Characters are: A…Z, a…z, 0…9, ! % $ * + - / = ? • Atom • String of one or more characters with no spaces between; Examples: 123, 1xyz, fred • #\ used for character constants; e.g., #\newline • #t, #f (true, false) • Upper/lower case only distinguished in constants
Math • Form of function application is prefix Syntax: operatorvaluevalue • Expressions are parenthesized, e.g., (+ 1 2) • Math operators: + - / *; other examples: • Other examples: abs, sqrt, modulo, remainder • Nested expressions often used: (abs (* (- 2 3) (- 0 1)))
“Interactions” window > (+ 3 4) 7 > > (+ (- 6 3) 10) WARNING: Interactions window is out of sync with the definitions window. Click Execute. 13 • Notation: (+ (- 6 3) 10) 13
Predicates: Functions returning boolean values • Often named ending with “?” equal? – test for equality (works with lists) boolean? – test for boolean type object integer? – test for integer type object (equal? 10 3) #f (equal? 4 4) #t (boolean? #f) #t
Relational operators and functions (> op1 op2) – test if op1 > op2 (< op1 op2) – test if op1 < op2 (= op1 op2) – numeric equality test (>= op1 op2) (<= op1 op2) (not op1) – negate the boolean operand (and op1op2) – boolean conjunction (or op1op2) – boolean disjunction
Defining & using variables (define x 1) • defines variable x to have value 1 > (define a 4) > a 4 a 4 (+ a 6) 10
Lists • Lists () is the empty list Lists are fully parenthesized and contain lists and/or sequences of atoms • Often need to quote lists to pass as parameters to functions • E.g., test if two lists “(+ 1 2)” and “(+ 2 1)” are equal (equal? (+ 1 2) (+ 2 1)) #t • Quote the lists so that they are not evaluated (equal? ‘(+ 1 2) ‘(+ 2 1)) #f • Quotes just need single quote in front of list
Functions for lists (member op1op2) – if op1 is a list element of op2, return sublist of op2 starting with op1; else return #f (member ‘1 ‘(+ 1 2)) (1 2) (member ‘- ‘(+ 1 2)) #f (member ‘1 ‘((1 2) (2 3))) #f
List construction functions-1 (list op1op2 …) - form a list from a sequence of items (append op1op2 …) – put elements of lists in a new list (car op) - return the head element of a list op (cdr op) - return the tail of a list op, as a list (cons op1op2) - make new list with op1 on front of op2 (list ‘a ‘b ‘c) (a b c) (append '(a) '(b)) (a b) (car ‘(a b)) a (cdr ‘(a b)) (b) (cons ‘a ‘(b c)) (a b c)
Exercise-1 (list ‘(a) ‘b)) (append ‘(a b c) ‘(1 2 3)) (car (list ‘a ‘b ‘c)) (cdr ‘((a b) c)) (cdr ‘(a)) (cons ‘a ‘((b))) (cons ‘(a) ‘())
List construction functions-2 • More list functions & predicates caar: (car (car x)) cadr: (car (cdr x)) caddr: (car (cdr (cdr x))) etc (up to 4 operators in a sequence) (null? ‘()) #t (null? ‘(a b c)) #f (null? (cdr ‘(a))) #t
Defining list variables (define y ‘(a b c)) y (a b c) (define init-state ‘((blank 5 4) (6 1 8) (7 3 2))) (car init-state) (blank 5 4)
Define-struct: Dr. Scheme Syntax: (define-struct name (field1field2 …)) Make new structs: make-name Get elements: name-field2, name-field2… (define-struct row (left middle right)) (define row1 (make-row ‘blank 1 8)) (row-left row1) blank (row-middle row1) 1 (row-right row1) 8
Conditional evaluation Syntax: (cond [bool-condition1expr1] [bool-condition2expr2] … [else default-expr] ; optional ) (define init-state ‘((blank 5 4) (6 1 8) (7 3 2))) (cond [(null? init-state) init-state] [else (car init-state)] ) (blank 5 4)
Functions-1 • Use “lambda expressions” • Syntax: (lambda (op1op2 …) (expression)) (lambda (init-state) (cond [(null? init-state) init-state] [else (car init-state)] ) ) #<procedure> >
Functions-2: Supplying parameters (list ‘(a)) ; typical function usage ( list ; the function ‘(a) ; the parameter ) ( (lambda (init-state) (cond [(null? init-state) init-state] [else (car init-state)] ) ) ; the function '(a) ; the parameter )
Functions-3 • Usually want to name our functions • These have been “anonymous” functions (define ourFun (lambda (arg) (cond [(null? arg) arg] [else (car arg)] ) ; end cond ) ; end lambda ) ; end define (ourFun '(a)) a
Exercise-2 • Write a function to return –1, 0, +1 depending on two parameters a and b a < b return –1 a > b return +1 a = b return 0
Recursion: Control structure in functional programming • Count the number of elements in a list (define list-length (lambda (myList) (cond [(null? myList) 0] [else (+ 1 (list-length (cdr myList)) ) ] ) ; end cond ) ; end lambda ) ; end list-length
Recursive list reverse (define list-reverse (lambda (myList) (cond [(null? myList) myList] [else (append (list-reverse (cdr myList)) (list (car myList)) ) ] ; end else ) ; end cond ) ; end lambda ) ; end list-reverse
Non-negative integer multiply through repeated addition (define int-mult (lambda (x y) (cond [(equal? y 0) 0] [(equal? x 0) 0] [(equal? y 1) x] [else (+ x (int-mult x (- y 1)) ) ] ; end else ) ; end cond ) ; end lambda ) ; end int-mult