Robot Programming with Lisp

Similar documents
INF4820: Algorithms for Artificial Intelligence and Natural Language Processing. Common Lisp Fundamentals

A little bit of Lisp

INF4820: Algorithms for Artificial Intelligence and Natural Language Processing. More Common Lisp

CS 480. Lisp J. Kosecka George Mason University. Lisp Slides

Common LISP Tutorial 1 (Basic)

Modern Programming Languages. Lecture LISP Programming Language An Introduction

Symbolic Programming. Dr. Zoran Duric () Symbolic Programming 1/ 89 August 28, / 89

Allegro CL Certification Program

Common Lisp. Blake McBride

LISP. Everything in a computer is a string of binary digits, ones and zeros, which everyone calls bits.

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 2. ÚVOD DO LISPU: ATOMY, SEZNAMY, FUNKCE,

Artificial Intelligence Programming

Allegro CL Certification Program

Lecture Notes on Lisp A Brief Introduction

Gene Kim 9/9/2016 CSC 2/444 Lisp Tutorial

Lecture #2 Kenneth W. Flynn RPI CS

Announcement. Overview. LISP: A Quick Overview. Outline of Writing and Running Lisp.

Symbolic Computation and Common Lisp

Department of Computer and information Science Norwegian University of Science and Technology

CS 314 Principles of Programming Languages

CSCI337 Organisation of Programming Languages LISP

Robot Programming with Lisp

Functional Programming with Common Lisp

Debugging in LISP. trace causes a trace to be printed for a function when it is called

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 4. LISP: PROMĚNNÉ, DALŠÍ VLASTNOSTI FUNKCÍ, BLOKY, MAPOVACÍ FUNKCIONÁLY, ITERAČNÍ CYKLY,

Functional Programming Lecture 1: Introduction

Functional Programming. Pure Functional Languages

Imperative, OO and Functional Languages A C program is

Introduction to Lisp

INF4820. Common Lisp: Closures and Macros

Section 10: LISP to Scheme. Evolution of Software Languages

Functional Programming. Pure Functional Languages

Chapter 1. Fundamentals of Higher Order Programming

(defmacro while (condition &body body) `(iterate loop () (if,condition (loop)))))

A Brief Introduction to Common Lisp

Functional Programming. Pure Functional Programming

Look at the outermost list first, evaluate each of its arguments, and use the results as arguments to the outermost operator.

Robot Programming with Lisp

Organization of Programming Languages CS3200/5200N. Lecture 11

Functional Languages. CSE 307 Principles of Programming Languages Stony Brook University

Scheme: Expressions & Procedures

SOFTWARE ARCHITECTURE 6. LISP

11/6/17. Functional programming. FP Foundations, Scheme (2) LISP Data Types. LISP Data Types. LISP Data Types. Scheme. LISP: John McCarthy 1958 MIT

Scheme Tutorial. Introduction. The Structure of Scheme Programs. Syntax

COP4020 Programming Languages. Functional Programming Prof. Robert van Engelen

Functions, Conditionals & Predicates

Functional Programming. Big Picture. Design of Programming Languages

Scheme: Data. CS F331 Programming Languages CSCE A331 Programming Language Concepts Lecture Slides Monday, April 3, Glenn G.

Common LISP-Introduction

Chapter 11 :: Functional Languages

FUNKCIONÁLNÍ A LOGICKÉ PROGRAMOVÁNÍ 5. LISP: MAKRA, DATOVÁ STRUKTURA ZÁZNAM

Intro. Scheme Basics. scm> 5 5. scm>

Fall 2018 Discussion 8: October 24, 2018 Solutions. 1 Introduction. 2 Primitives

Heap storage. Dynamic allocation and stacks are generally incompatible.

Common Lisp. In Practical Usage

Functional Languages. Hwansoo Han

Allegro CL Certification Program

Announcements. Today s Menu

FP Foundations, Scheme

LECTURE 16. Functional Programming

Jatha. Common Lisp in Java. Ola Bini JRuby Core Developer ThoughtWorks Studios.

Imperative languages

A Genetic Algorithm Implementation

Documentation for LISP in BASIC

Fifth Generation CS 4100 LISP. What do we need? Example LISP Program 11/13/13. Chapter 9: List Processing: LISP. Central Idea: Function Application

(defvar *state* nil "The current state: a list of conditions.")

XLISP PLUS. Reference Manual. Version 3.0

6.001: Structure and Interpretation of Computer Programs

4/19/2018. Chapter 11 :: Functional Languages

CSC 533: Programming Languages. Spring 2015

CSCI 2210: Programming in Lisp. Progn. Block. CSCI Programming in Lisp; Instructor: Alok Mehta 1. ANSI Common Lisp, Chapters 5-10

UMBC CMSC 331 Final Exam

Object Oriented Programming (OOP)

LISP - QUICK GUIDE LISP - OVERVIEW

COP4020 Programming Assignment 1 - Spring 2011

Type-checking on Heterogeneous Sequences

Vanilla Lisp Shell (VLS)

15 Unification and Embedded Languages in Lisp

Functional programming with Common Lisp

by the evening of Tuesday, Feb 6

Introduction 2 Lisp Part I

It is better to have 100 functions operate one one data structure, than 10 functions on 10 data structures. A. Perlis

A Quick Introduction to Common Lisp

CSCE476/876 Fall Homework 3: Programming Assignment Using Emacs and Common Lisp. 1 Exercises (15 Points) 2. 2 Find (6 points) 4

Introduction to LISP. York University Department of Computer Science and Engineering. York University- CSE V.

Week 2: The Clojure Language. Background Basic structure A few of the most useful facilities. A modernized Lisp. An insider's opinion

19 Machine Learning in Lisp

CPL 2016, week 10. Clojure functional core. Oleg Batrashev. April 11, Institute of Computer Science, Tartu, Estonia

CS 314 Principles of Programming Languages. Lecture 16

Lecture #24: Programming Languages and Programs

CS A331 Programming Language Concepts

Meet the Macro. a quick introduction to Lisp macros. Patrick Stein / TC Lisp Users Group /

Recursive Functions of Symbolic Expressions and Their Computation by Machine Part I

COMMOM OBJECT ORIENTED LISP SYSTEMS

Expressions and Assignment

An Introduction to Scheme

Ruby: Introduction, Basics

CMPUT325 Extensions to Pure Lisp. Extensions to Pure Lisp. Bob Price and Russ Greiner. 5th October 2004

Lecture 2. COMP1406/1006 (the Java course) Fall M. Jason Hinek Carleton University

ALISP interpreter in Awk

Transcription:

2. Imperative Programming Institute for Artificial University of Bremen

Lisp the Language LISP LISt Processing language 2

Lisp the Language LISP LISt Processing language (LISP Lots of Irritating Superfluous Parenthesis) Copyright: XKCD 3

Technical Characteristics Dynamic typing: specifying the type of a variable is optional 4

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC 5

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC Functions as first-class citizens (e.g. callbacks) 6

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC Functions as first-class citizens (e.g. callbacks) Anonymous functions 7

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC Functions as first-class citizens (e.g. callbacks) Anonymous functions Side-effects are allowed, not purely functional as, e.g., Haskell 8

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC Functions as first-class citizens (e.g. callbacks) Anonymous functions Side-effects are allowed, not purely functional as, e.g., Haskell Run-time code generation 9

Technical Characteristics Dynamic typing: specifying the type of a variable is optional Garbage collection: first language to have an automated GC Functions as first-class citizens (e.g. callbacks) Anonymous functions Side-effects are allowed, not purely functional as, e.g., Haskell Run-time code generation Easily-expandable through the powerful macros mechanism 10

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 11

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 12

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) 13

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 14

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 15

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 16

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 1970s - 2000s: Franz Lisp (UC Berkeley), NIL (MIT, Yale), AutoLISP (AutoCAD), Le Lisp (INRIA), PSL (Utah), CMUCL (CMU), T (Yale), Racket, SKILL, LFE (Lisp Flavoured Erlang), ISLISP (ISO standard),... 17

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 1970s - 2000s: Franz Lisp (UC Berkeley), NIL (MIT, Yale), AutoLISP (AutoCAD), Le Lisp (INRIA), PSL (Utah), CMUCL (CMU), T (Yale), Racket, SKILL, LFE (Lisp Flavoured Erlang), ISLISP (ISO standard),... 1984: Common Lisp by Guy Steele, 1999: SBCL 18

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 1970s - 2000s: Franz Lisp (UC Berkeley), NIL (MIT, Yale), AutoLISP (AutoCAD), Le Lisp (INRIA), PSL (Utah), CMUCL (CMU), T (Yale), Racket, SKILL, LFE (Lisp Flavoured Erlang), ISLISP (ISO standard),... 1984: Common Lisp by Guy Steele, 1999: SBCL 1990: Haskell, 1998 the first standard 19

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 1970s - 2000s: Franz Lisp (UC Berkeley), NIL (MIT, Yale), AutoLISP (AutoCAD), Le Lisp (INRIA), PSL (Utah), CMUCL (CMU), T (Yale), Racket, SKILL, LFE (Lisp Flavoured Erlang), ISLISP (ISO standard),... 1984: Common Lisp by Guy Steele, 1999: SBCL 1990: Haskell, 1998 the first standard 2004: ANSI Common Lisp 20

Short History 1958: Lisp as a theoretical language designed by John McCarthy (MIT) 1958: First Lisp interpreter implementation by Steve Russel (MIT) 1962: First Lisp compiler by Tim Hart and Mike Levin (MIT) End of 1960s: MacLisp (MIT), Interlisp (Xerox, Stanford, DARPA) 1975: Scheme (MIT) 1976: Emacs and EmacsLisp by Richard Stallman and Guy Steele 1970s - 2000s: Franz Lisp (UC Berkeley), NIL (MIT, Yale), AutoLISP (AutoCAD), Le Lisp (INRIA), PSL (Utah), CMUCL (CMU), T (Yale), Racket, SKILL, LFE (Lisp Flavoured Erlang), ISLISP (ISO standard),... 1984: Common Lisp by Guy Steele, 1999: SBCL 1990: Haskell, 1998 the first standard 2004: ANSI Common Lisp 2007: Clojure 21

Hello World 22

Hello World Java Hello World public class HelloWorld { public static void main(string[ ] args) { System.out.println("Hello World!"); } } 23

Hello World Java Hello World public class HelloWorld { public static void main(string[ ] args) { System.out.println("Hello World!"); } } Lisp Hello World "Hello World!" 24

Hello World Java Hello World public class HelloWorld { public static void main(string[ ] args) { System.out.println("Hello World!"); } } Lisp Hello World "Hello World!" Rapid prototyping Read-Eval-Print Loop (Lisp shell) 25

Polish Notation Also known as prefix notation. Examples (+ 1 2 3 4) (sin 3.14) (/ (+ 4 2) 3) (list 1 2 3) (defun return-my-arg (arg) arg) (return-my-arg 302) S-expressions (S for symbolic) 26

Numbers Integer CL-USER> (describe 1) 1 [fixnum] Float CL-USER> (describe 1.0) (describe 1f0) 1.0 [single-float] CL-USER> 1f3 1000.0 Double CL-USER> (describe 1d0) 1.0d0 [double-float] 27

More Numbers Ratio CL-USER> (/ 1 3) 1/3 CL-USER> (describe 1/3) 1/3 [ratio] CL-USER> (describe (/ 1.0 3)) 0.33333334 [single-float] Numeral Systems CL-USER> #xff 255 CL-USER> #b1111 15 28

Chars and Strings Char CL-USER> (describe #\Z) #\Z [standard-char] :_Char-code: 90 :_Char-name: LATIN_CAPITAL_LETTER_Z CL-USER> (describe #\Ö) #\LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS [character] :_Char-code: 214 :_Char-name: LATIN_CAPITAL_LETTER_O_WITH_DIAERESIS String CL-USER> (describe "hello") "hello" [simple-string] 29

Variables and Symbols Variable CL-USER> x The variable X is unbound. Symbol CL-USER> (describe 'x) COMMON-LISP-USER::X [symbol] Keyword CL-USER> (describe :x) (describe ':x) :X [symbol] X names a constant variable: Value: :X 30

Booleans False CL-USER> (describe NIL) COMMON-LISP:NIL [null] NIL names a constant variable: Value: NIL NIL names a primitive type-specifier True CL-USER> (describe T) COMMON-LISP:T [symbol] T names a constant variable: Value: T T names the built-in-class #<BUILT-IN-CLASS T>:... T names a primitive type-specifier 31

Lists List CL-USER> (list 1 2 3) (1 2 3) CL-USER> * (1 2 3) CL-USER> (describe *) (1 2 3) [list] CL-USER> '(1 2 3) (1 2 3) CL-USER> '((1.1 1.2) (2.1 2.2) (some more stuff) (+ 1 3)) ((1.1 1.2) (2.1 2.2) (SOME MORE STUFF) (+ 1 3)) 32

Lists Explained 1 2 3 NIL It s a linked list where each element has only 2 slots: value and next-elem. next-elem of the last element is NIL. The elements are called cons cells or cons pairs. List and NIL CL-USER> '() NIL CL-USER> (list ) NIL CL-USER> (type-of '(1 1 1)) CONS CL-USER> (listp '(1 1 1)) T CL-USER> (listp '()) T 33

Association Lists A 1 B 2 C 3 NIL It s a list where the first element of each cons cell is itself a cons cell. AList CL-USER> '((A. 1) (B. 2) (C. 3)) ((A. 1) (B. 2) (C. 3)) CL-USER> (describe *) ((A. 1) (B. 2) (C. 3)) [list] 34

Arrays Vector CL-USER> #(1 2 3) #(1 2 3) Matrix CL-USER> #2A((1 2) (3 4)) #2A((1 2) (3 4)) Mutli-dimensional array CL-USER> (make-array '(4 2 3) :initial-contents '(((a b c) (1 2 3)) ((d e f) (3 1 2)) ((g h i) (2 3 1)) ((j k l) (0 0 0)))) #3A(((A B C) (1 2 3)) ((D E F) (3 1 2)) ((G H I) (2 3 1)) ((J K L) (0 0 0))) 35

Data Types t atom character number symbol sequence function real complex list array rational float integer ratio null list cons vector simple-array string simple-vector The diagram is very simplified. Also, the following is completely omitted: standard-object (CLOS) stream (files) condition (error handling),... 36

Data and Code Quoted constructs (both atoms and lists) are data: CL-USER> '"abc" "abc" CL-USER> '(+ 1 2) (+ 1 2) Everything else is code: CL-USER> (+ 1 2) 3 Conclusion: run-time code generation and manipulation done easily! CL-USER> (eval '(+ 1 2)) ; but don't EVER use "eval" directly 3 37

Code as Composition of Lists Code is one big nested list. Depending on the first element, an S-expression is compiled into a function, special form or macro. Function CL-USER> '(list '+ 1 2) (LIST '+ 1 2) CL-USER> (eval *) (+ 1 2) CL-USER> (eval *) 3 Special Form CL-USER> (list 'if t 1 2) (IF T 1 2) CL-USER> (eval *) 1 Macro CL-USER> (list 'defun 'return-a '(a) 'a) (DEFUN RETURN-A (A) A) CL-USER> (eval *) RETURN-A CL-USER> (return-a 5) 5 38

More on Symbols Symbol CL-USER> (setf my-symbol 1) 1 CL-USER> (defun my-symbol () 2) MY-SYMBOL CL-USER> (setf (get 'my-symbol 'my-property) 3) 3 CL-USER> 'my-symbol MY-SYMBOL Symbol Field Value Name my-symbol Package COMMON-LISP-USER aka CL-USER Value 1 Function #<FUNCTION MY-SYMBOL> Property list (MY-PROPERTY 3) To inspect an expression in the REPL: right click inspect. 39

Read-Eval-Print Loop atom expression list not-symbol symbol function special form macro value of itself symbol s value slot evaluate arguments then call function evaluate only as defined in the form turn macro into code and execute it An example for special form REPLoop evaluation is the if command: it evaluates only the first parameter, then chooses to evaluate either the second or third. 40

Imperative Programming The imperative programming paradigm represents programs as sequences of commands. One important property thereof is that the program has a state and the commands manipulate it to achieve a desired state. Common Lisp has powerful means for imperative programming (e.g., very advanced looping mechanisms) but many traditionally imperative constructs are implemented differently in Lisp. We ll consider both ways (imperative vs. functional) and then compare them. 41

Special Variables Global Variables CL-USER> (defvar *my-global-var* 'some-value "test variable") *MY-GLOBAL-VAR* CL-USER> *my-global-var* SOME-VALUE CL-USER> (setf *my-global-var* 23) 23 CL-USER> *my-global-var* 23 CL-USER> (incf *my-global-var*) 24 CL-USER> (defvar *my-global-var* 25) *MY-GLOBAL-VAR* CL-USER> *my-global-var* 24 Naming convention: *the-variable-name*. 42

Special Variables [2] Parameters CL-USER> (defparameter *my-param* 0.01) *MY-PARAM* CL-USER> *my-param* 0.01 CL-USER> (setf *my-param* 0.1) 0.1 CL-USER> *my-param* 0.1 CL-USER> (defparameter *another-param*) error while parsing arguments to DEFMACRO DEFPARAMETER CL-USER> (defparameter *my-param* 0.5) *MY-PARAM* CL-USER> *my-param* 0.5 43

Special Variables [3] Constants CL-USER> (defconstant +my-pi+ 3.14) +MY-PI+ CL-USER> +my-pi+ 3.14 CL-USER> (setf +my-pi+ 3.14159) Condition: +MY-PI+ is a constant and thus can't be set. CL-USER> (defconstant +my-pi+ 3.14159) +MY-PI+ Condition: The constant +MY-PI+ is being redefined. Naming convention: +the-constant-name+. 44

Local Variables Constants CL-USER> (let ((a 1) (b 2)) (print a) b) 1 2 CL-USER> (print b) The variable B is unbound. 45

Type Operations Predicates (type-of 5) INTEGER (typep 5 'number) T (type-of #c(5 1)) COMPLEX (type-of 'nil) NULL (listp '(1 2 3)) T (symbolp 'a) T (type-of :k) KEYWORD (symbolp :k) T Casts (coerce '(a b c) 'vector) #(A B C) (coerce "a" 'character) #\a (coerce 7/2 'float) 3.5 (coerce 7/2 'number) 7/2 (coerce 7/2 't) 7/2 (coerce 7/2 'null) 7/2 can't be converted to type NULL. 46

Comparing Casts CL-USER> (> 2 1.5d0) T CL-USER> (<= 3.0d0 3) T CL-USER> (eq 1 1) T CL-USER> (eq 'bla 'bla) T CL-USER> (eq "bla" "bla") NIL CL-USER> (eq '(1 2 3) '(1 2 3)) NIL CL-USER> (eql '(1 2 3) '(1 2 3)) NIL CL-USER> (eql 1.0 1) NIL CL-USER> (equal '(1 2 3) '(1 2 3)) T CL-USER> (equal "bla" "bla") T CL-USER> (equal "bla" "Bla") NIL CL-USER> (equalp "bla" "Bla") T CL-USER> (equal #(1 2 3) #(1 2 3)) NIL CL-USER> (equalp #(1 2 3) #(1 2 3)) T CL-USER> (= 2.4 2.4d0) NIL CL-USER> (string= "hello" "hello") T 47

Comparing [2] x y eq eql equal equalp a a T T T T 0 0? T T T (a) (a) nil nil T T ab ab nil nil T T Ab ab nil nil nil T 0 0.0 nil nil nil T 0 1 nil nil nil nil = is for comparing numbers of the same type. string= is an advanced tool for comparing strings. 48

List Operations Lists CL-USER> (cons 1 (cons 2 (cons 3 nil))) CL-USER> (list 1 2 3) CL-USER> '(1 2 3) (1 2 3) CL-USER> (listp *) T CL-USER> (null **) NIL CL-USER> (null '()) T CL-USER> (null '(())) NIL CL-USER> (member 2 '(1 2 3)) (2 3) CL-USER> (member 2 '((1 2) (3 4))) NIL CL-USER> (defvar *my-list* '(1 2 3 4 5)) *MY-LIST* CL-USER> (first *my-list*) 1 CL-USER> (rest *my-list*) (2 3 4 5) CL-USER> (nth 4 *my-list*) 5 CL-USER> (fourth *my-list*) 4 CL-USER> (last *my-list*) (5) CL-USER> (push 0 *my-list*) (0 1 2 3 4 5) 49

AList Operations Association Lists CL-USER> (cons (cons "Alice" "Jones") (cons (cons "Bill" "Smith") (cons (cons "Cathy" "Smith") nil))) (("Alice". "Jones") ("Bill". "Smith") ("Cathy". "Smith")) CL-USER> '(("Alice". "Jones") ("Bill". "Smith") ("Cathy". "Smith")) (("Alice". "Jones") ("Bill". "Smith") ("Cathy". "Smith")) CL-USER> (assoc "Alice" *) NIL CL-USER> (assoc "Alice" ** :test \#'string=) ("Alice". "Jones") CL-USER> (rassoc "Smith" *** :test \#'string=) ("Bill". "Smith") 50

Property Lists and Vectors Property Lists CL-USER> (defvar *plist* '()) *PLIST* CL-USER> (setf (getf *plist* 'key) 'value) VALUE CL-USER> *plist* (KEY VALUE) CL-USER> (setf (getf *plist* 'another-key) 'another-value) ANOTHER-VALUE CL-USER> *plist* (ANOTHER-KEY ANOTHER-VALUE KEY VALUE) CL-USER> (setf (getf *plist* 'key) 'new-value) NEW-VALUE CL-USER> *plist* (ANOTHER-KEY ANOTHER-VALUE KEY NEW-VALUE) Vectors CL-USER> #2A((1 2) (3 4)) #2A((1 2) (3 4)) CL-USER> (aref * 0 0) 1 CL-USER> (aref ** 1 1) 4 CL-USER> #(1 2 3 4 5 6) #(1 2 3 4 5 6) CL-USER> (setf (aref * 5) 9) 9 CL-USER> ** #(1 2 3 4 5 9) 51

I/O Artificial Format Statements, Streams and Files CL-USER> (read) hello world HELLO CL-USER> (read-line) hello world "hello world" CL-USER> (format nil "symbol to ~a" 'string) "symbol to STRING" CL-USER> (format t "1 + 1 = ~a~%" (+ 1 1)) 1 + 1 = 2 NIL CL-USER> (with-open-file (stream "~/.bashrc") (do ((line (read-line stream nil) (read-line stream nil))) ((null line)) (print line))) 52

Program Flow Constructs if, case, unless CL-USER> (defvar *weather* 'rainy) *WEATHER* CL-USER> (if (eql *weather* 'rainy) (format t "I'm staying at home.") (format t "Let's go for a walk!")) I'm staying at home. NIL CL-USER> (case *weather* (rainy "Stay home") (snowing "Go ski") (sunny "Got to the park") (otherwise "Hmmm...")) "Stay home" CL-USER> (setf *weather* 'very-nice) VERY-NICE CL-USER> (unless (eql *weather* 'rainy) (format t "Let's go for a walk!")) Let's go for a walk! 53

Program Flow Constructs [2] when, progn CL-USER> (setf *weather* 'rainy) RAINY CL-USER> (if (eql *weather* 'rainy) (progn (format t "Let's go for a walk.~%") (format t "But don't forget your umbrella.~%"))) Let's go for a walk. But don't forget your umbrella. NIL CL-USER> (when (eql *weather* 'rainy) (format t "Let's go for a walk.~%") (format t "But don't forget your umbrella.~%")) Let's go for a walk. But don't forget your umbrella. NIL 54

Program Flow Constructs [3] prog1, cond CL-USER> (progn (setf *weather* 'it-rains-cats) (format t "The weather today is ~a~%" *weather*)) The weather today is IT-RAINS-CATS NIL CL-USER> (prog1 (setf *weather* 'whatever) (format t "The weather today is ~a~%" *weather*)) The weather today is WHATEVER WHATEVER CL-USER> (defvar *x* 1.5) *X* CL-USER> (cond ((< *x* 0) -*x*) ((< *x* 1) 1) (t *x*)) 1.5 55

Logical Operators and, or, not CL-USER> (defparameter *threshold* 0.001) *THRESHOLD* CL-USER> (if (not (and (<= *threshold* 1) (> *threshold* 0))) (error "*threshold* should lie within (0; 1]~%")) NIL CL-USER> (if (or (> *threshold* 1) (<= *threshold* 0)) (error "*threshold* should lie within (0; 1]~%")) NIL CL-USER> (unless (and (<= *threshold* 1) (> *threshold* 0)) (error "*threshold* should lie within (0; 1]~%")) NIL 56

Looping dotimes, dolist, loop CL-USER> (dotimes (i 10 (format t "the end~%")) (format t "~d " i)) 0 1 2 3 4 5 6 7 8 9 the end NIL CL-USER> (defparameter *random* (loop repeat 10 collect (random 10000))) *RANDOM* CL-USER> (dolist (element *random* (format t "...~%")) (format t "~a " element)) 6505 5293 2987 2440 8012 3258 9871 896 2501 5158... NIL CL-USER> (loop for i in *random* counting (evenp i) into evens counting (oddp i) into odds summing i into total maximizing i into max minimizing i into min finally (return (list evens odds total max min))) (5 5 46921 9871 896) 57

Defining a Function and Calling It Defining a Function CL-USER> (defun my-cool-function-name (arg-1 arg-2 arg-3 arg-4) "This function combines its 4 input arguments into a list and returns it." (list arg-1 arg-2 arg-3 arg-4)) MY-COOL-FUNCTION-NAME Calling a Function CL-USER> (my-cool-function-name 1 3 5 7) (1 3 5 7) 58

Documentation Slime hotkeys (in the REPL or.lisp file): C-c C-d d C-c C-d f C-c C-d h C-c C-d C-h M-. M-, C-c M-m C-c C-v i describe symbol at point describe function at point open Hyperspec definition list all Slime bindings for getting documentation go into function definition return one level up from the definition stack macroexpand expression at point inspect presentation at point (only in REPL) (or right click inspect) Hint: cursor is called point in Emacs. 59

goals Lisp basics 60

Task 1: Update your repository Go to your lisp_course_material directory and update it: roscd && cd../src/lisp_course_material git pull origin master You will see a new directory that appeared there (assignment_2): ll Compile your workspace with the new assignment: cd../.. && catkin_make && rospack profile 61

Task 2: Lisp Homework Your Lisp assignment is in assignment_2/src/... (Re)start your Lisp REPL: roslisp_repl & Load the package code: CL-USER> (ros-load:load-system "assignment_2" :assignment-2) Follow the instructions in the simple-world.lisp file. Commit and push the changes once finished: git add. git commit -m "finished assignment_2" git push my-repo master 62

Links Artificial Revenge of the nerds: http://www.paulgraham.com/icad.html Paredit cheat sheet: http://pub.gajendra.net/src/paredit-refcard.pdf Practical Common Lisp online book: http://www.gigamonkeys.com/book/ The Little Schemer examples book: http://www.ccs.neu.edu/home/matthias/btls/ 63

Info summary : Due: 01.11., Wednesday, 23:59 German time Points: 7 points Next class: Date: 02.11. Time: 14:15 Place: same room (TAB 0.31) Lecturer: Arthur 64

Q & A Thanks for your attention! 65