CSCI 330 Lisp Syntax Reference | ; to define as a script #! /usr/bin/gcl -f ; 'x or (quote x) to prevent evaluation ; global variables and constants, setf (defvar x 3) (defconstant y 0) (setf x y) ; func with local vars, functions, ; optional and var number of params, ; and returning a lambda dispatch function (defun f (x y &optional (z 0) &rest r) (let* ((a 1) (b 2)) (labels ( (g (i j) ... body of g ...) (h (k l) ... body of h ...) ) ... initialization for f ... (lambda (cmd &optional (arg1 nil) (arg2 nil)) ... body of dispatcher, e.g.: (cond ((equal cmd 'whatever) (g a b)) ... etc ... ))))) ; function with mix of regular and keyword params, and ; using a dynamically scoped variable from ancestor (defun f (x &key y z) (declare (special w)) ... body of f ...) ; sample call to f (f 10 :z 3 :y 2) ; formats for output to stdout or to string (format t "x is ~A~%" x) (format nil "x is ~A~%" x) (force-output) ; clear output buffer ; read a lisp term, an entire line, or a char (read) (read-line) (read-char) (read-from-string str) (unread-char c) ; put back in buffer (clear-input) ; clear input buffer ; common conditionals (cond shown earlier) (if (< x y) expr_if_true expr_if_false) (when (< x y) ... things to do if true ...) (unless (< x y) ... things to do if false ...) (case expr (val1 ...what to do if expr==val1...) (val2 ...what to do if expr==val2...) (otherwise ...what to do otherwise...)) (typecase expr (string ...what to do if expr is a string...) (integer ...what to do if expr is an integer..) (t ...what to do otherwise...)) | ; math functions and literals ; literals: 3.55 3/2 17 ; comparisons: < <= > >= = /= ; unary funcs: + - sin cos tan sqrt ; incf decf abs ceiling floor ; other funcs: + - / * mod min max exp log gcd lcm ; char functions and literals (setf x #\q) ; char literal q ; comparisons: char= char/= char< etc (code-char 63) (char-code c) ; convert from/to ascii (char-upcase c) (char-downcase c) ; convert case ; special chars: #\Newline #\Backspace #\Tab ; logic functions ; t is true, nil or '() are false (and a b c) (not x) (or a b c) ; bitwise 2's complement functions ; logic: logand, logior, lognot, logxor, etc ; shift: (ash x n) (ash x -n) shifts left/right n bits ; seq functions (can be used with lists, arrays, etc) (make-sequence 'list 3 :initial-element 0) (length s) (elt s pos) (count e s) (position e s) (substitute newE oldE s) (copy-seq s) (remove e s) (concatenate 'string s1 s2) ; specifies type of sequence ; list functions and literals (cons e L) (car L) (cdr L) ; combos to 4, eg. cdadar (length L) (nth n L) (append L1 L2) (member e L) (reverse L) (null L) (copy-list L) (last L) (butlast L) (pop L) (push e L) (list 1 2 3 4) ; hash functions (make-hash-table) (gethash key H) (setf (gethash k H) val) (remhash key H) (hash-table-count H) (maphash f H) ; apply f to H's key/value pairs (loop for k being the hash-keys of H do ... do stuff with key k ...) ; can use similar loop for hash-values ; array functions (make-array '(3 4) :initial-element 0) (aref arr i j) (array-dimensions arr) (setf (aref arr i j) value) ; vector functions (vector 10 20 30) (svref vec pos) (setf (svref vec pos) val) ; string functions ; comparisons: string=, string/=, string< etc (count str c) (char str pos) (string-upcase str) (string-downcase str) (substitute oldC newC str) (parse-integer "1234") | ; struct functions (defstruct S field1 field2 field3) ; functions built by defstruct (make-S) (S-p x) (copy-S x) (S-field1 x) (S-field2 x) etc (setf (S-field1 x) val) ; symbol functions and literals (symbol-name sym) (intern "sym") (makunbound sym) (fmakunbound sym) (symbol-plist sym) (get sym prop) (setf (get sym prop) val) (remprop sym prop) ; equality checking, least strict to most equalp, =, eq, equal ; typechecking functions numberp realp floatp integerp fixnump stringp characterp listp sequencep hash-table-p arrayp vectorp symbolp boundp fboundp (typeof item) (typep item type) (coerce item type) ; higher order functions and calls (funcall f x y z) (apply f '(x y z)) (eval '(f x y z)) (map 'list '* '(10 20) '(1 2)) ; (10 40) (mapcar '- '(1 2 3)) ; (-1 -2 -3) (maplist 'length '(10 20 30)) ; (3 2 1) (reduce 'exp '(3 4 5)) computes (3^4)^5 ; macros (defmacro m (x L &rest r) (let ((s (gensym))) `... body of macro ... ,L ; to embed L as a list ,@L ; to embed contents of L ,s ; to use the generated symbol )) ; do, dolist, dotimes (dolist (x L) ...do stuff with x...) (dotimes (x numTimes (+ x 1)) ...do stuff with x...) (do ( (x 0 (+ x 1)) (y 10 (- y 1)) ) ; local var, init, update ( (> x y) ; stopping condition ...stuff to do after stopping... ) ...loop body...) ; returning and capturing multiple values (values val1 val2 val3) (nth-value n (function call)) (multiple-bind (a b c) (function call) ... do stuff with a b c ...) ; nested blocks, return from (block 'OuterBlock ... actions ... (block 'InnerBlock ... actions ... (if (expr) return-from 'OuterBlock) ... actions ...)) |