
- LISP Tutorial
- LISP - Home
- LISP - Overview
- LISP - Environment
- LISP - REPL
- LISP - Program Structure
- LISP - Basic Syntax
- LISP - Data Types
- Lisp Macros
- LISP - Macros
- LISP - Backquote and Comma
- LISP - Code Generation Using Macro
- LISP - Variable Capture and Hygienic macro
- LISP - Scope and Binding
- LISP - Macro Writing Style
- LISP - Macro Characters
- LISP - Read-Time Macros
- LISP - Compiler Macros
- LISP - Uses of Macros
- Lisp Functions
- LISP - Functions
- LISP - Functions vs Macros
- LISP - Calling Function using funcall
- LISP - Calling Function using apply
- LISP - Closures
- LISP - Functions as Arguments
- LISP - Functions as Return Values
- LISP - Recursion
- LISP - Built-in Functions
- Lisp Predicates
- LISP - Predicates
- LISP - Generic Data Type Predicates
- LISP - Specific Data Type Predicates
- LISP - Equality Predicates
- LISP - Numeric Predicates
- LISP - Comparison Predicates
- LISP - Logical Predicates
- LISP - List Predicates
- LISP - Custom Predicates
- LISP - Chaining Predicates
- Lisp Arrays
- LISP - Arrays
- LISP - Adjustable Arrays
- LISP - Fill Pointers in Arrays
- LISP - Specialized Arrays
- LISP - Arrays Properties
- LISP - Iterating over Arrays
- LISP - Multidimensional Arrays
- LISP - Row-Major Order
- Lisp Strings
- LISP - Strings
- LISP - String Concatenation
- LISP - String Comparison
- LISP - String Case Conversion
- LISP - String Trimmimg
- LISP - String Searching
- LISP - Getting Substring
- LISP - String Replacement
- LISP - Sorting Strings
- LISP - Merging Strings
- LISP - Accessing Characters of String
- LISP - String length
- LISP - Escape Sequences
- Lisp Sequences
- LISP - Sequences
- LISP - Accessing Element of Sequence
- LISP - Sequence length
- LISP - Getting Subsequence
- LISP - Search Element in Sequence
- LISP - Sequence Concatenation
- LISP - Reversing a Sequence
- LISP - Mapping Sequence Element
- LISP - position of Element
- LISP - Remove an Element
- LISP - Sort Sequence
- LISP - Merge Sequences
- LISP - every function
- LISP - some function
- LISP - notany function
- LISP - notevery function
- Lisp Lists
- LISP - Lists
- LISP - Accessing Elements of Lists
- LISP - Modifications to Lists
- LISP - Using mapcar on List
- LISP - Using mapc on List
- LISP - Using reduce on List
- LISP - Removing elements from List
- LISP - Reversing a List
- LISP - Sorting a List
- LISP - Searching a List
- LISP - List vs Vectors
- LISP - Matrix Multiplication
- Lisp Vectors
- LISP - Vectors
- LISP - Creating Vectors
- LISP - Accessing Elements of Vectors
- LISP - Modifications to Vectors
- LISP - Adjustable Vectors
- LISP - Specialized Vectors
- LISP - Vector Functions
- Lisp Set
- LISP - Set
- LISP - Adding elements to the Set
- LISP - Getting SubSet from a Set
- LISP - Set Difference
- LISP - Set Exclusive OR
- LISP - Set Intersection
- LISP - Set Union
- LISP - Representing Set with HashTable
- LISP - List as Set vs HashTable as Set
- Lisp Tree
- LISP - Tree
- LISP - Recursive Traversal
- LISP - Inorder Traversal
- LISP - Preorder Traversal
- LISP - Postorder Traversal
- LISP - Depth First Traversal
- LISP - Modifying Tree
- LISP - Search Tree
- LISP - Binary Tree
- Lisp Hash Table
- LISP - Hash Table
- Adding Values to Hash Table
- Removing Values from Hash Table
- Updating Values of Hash Table
- Iterating Hash Table Entries
- Searching key in HashTable
- Checking Size of HashTable
- Using Custom Equality Check
- Lisp - Input − Output
- LISP - Input − Output
- LISP - Streams
- LISP - Reading Data from Streams
- LISP - Writing Data to Streams
- LISP - File I/O
- LISP - String I/O
- LISP - Formatting with Format
- LISP - Interactive I/O
- LISP - Error Handling
- LISP - Binary I/O
- Lisp - Structures
- LISP - Structures
- LISP - Accessors and Mutators
- LISP - Structure Options
- LISP - Structure Types
- LISP - Applications and Best Practices
- Lisp - CLOS
- LISP - CLOS
- Lisp - Objects
- LISP - Class
- LISP - Slots and Accessors
- LISP - Generic Functions
- LISP - Class Precedence
- LISP - Metaobject Protocol
- LISP - Multimethods
- LISP - Multiple Inheritance
- LISP - Method Combinations
- LISP - Method Combinations
- LISP - :before Method Combination
- LISP - :primary Method Combination
- LISP - :after Method Combination
- LISP - :around Method Combination
- LISP - + Method Combination
- LISP - and Method Combination
- LISP - append Method Combination
- LISP Useful Resources
- Lisp - Quick Guide
- Lisp - Useful Resources
- Lisp - Discussion
Lisp - List Predicates
List predicates in LISP are very useful predicate for LIST operations. Following are some of the important list predicates with examples to understand their functionalities.
Example - listp - to check if object is a list
listp predicates returns true if object is a list.
main.lisp
(write(listp '(1 2 3))) ; T ,A list (terpri) (write(listp 'a)) ; NIL ,A symbol (terpri) (write(listp "hello")) ; NIL ,A string (terpri) (write(listp '(a . b))) ; T ,A dotted list, which is still a list (terpri) (write(listp nil)) ; T ,Empty list is also a list
Output
When you execute the code, it returns the following result −
T NIL NIL T T
Example - consp - to check if object is a cons cell
consp predicates returns true if object is a cons cell, a building block of non-empty list.
main.lisp
(write(consp '(1 2 3))) ; T (terpri) (write(consp 'a)) ; NIL (terpri) (write(consp "hello")) ; NIL (terpri) (write(consp '(a . b))) ; T (terpri) (write(consp nil)) ; NIL ,Empty list is not a cons cell
Output
When you execute the code, it returns the following result −
T NIL NIL T NIL
Example - null - to check an empty list
null predicate is a standard way to check an empty list or nil list.
main.lisp
(write(null '(1 2 3))) ; NIL (terpri) (write(null 'a)) ; NIL (terpri) (write(null nil)) ; T (terpri) (write(null '())) ; T , equivalent to nil
Output
When you execute the code, it returns the following result −
NIL NIL T T
Example - member - to check if element is member
member returns a sublist from first occurance of element if found which is truthy value in LISP.
if element is not found, it returns nil
:test keyword can be used to specify an equality function like eql, equal , string-equal etc. to find an element.
:test-not keyword can be used to element is not same as equal as list elements.
main.lisp
(write(member 'b '(a b c))) ; (B C) ,sublist starting with the found element (terpri) (write(member 'd '(a b c))) ; NIL, not found (terpri) (write(member 'b '(a b b c))) ; (B B C) ,sublist starting with the first occurence of element (terpri) (write(member 'b '(a (b c) d) :test #'equal)) ; NIL as ' and '(b c) are not equal (terpri) (write(member '(b c) '(a (b c) d) :test #'equal)) ; ((B C) D), using equal for comparison (terpri) (write(member 'b '(a b c) :test #'eq)) ; (B C), uses eq for comparison (terpri) (write(member 'b '(a b c) :test-not #'equal)) ; (A B C) , finds an element which is not equal to 'b
Output
When you execute the code, it returns the following result −
(B C) NIL (B B C) NIL ((B C) D) (B C) (A B C)
Example - assoc - to find an association
assoc returns an association as a key-value pair often represented as dotted pair.
if association is not found, it returns nil
:test keyword can be used to specify an equality function like eql, equal , string-equal etc. to find an element.
assoc returns entire association if found.
main.lisp
; create an association list (setq alist '((a . 1) (b . 2) (c . 3))) (write(assoc 'b alist)) ; (B . 2) (terpri) (write(assoc 'd alist)) ; NIL (terpri) (write(assoc 'b alist :test #'equal)) ; (B . 2) ,using equal for comparison
Output
When you execute the code, it returns the following result −
(B . 2) NIL (B . 2)
Example - endp - to check end of the list
end is a more generic way to check if we're at end of list structure.
end works for both proper lists and dotted lists.
main.lisp
(write(endp '(1 2 3))) ; NIL (terpri) (write(endp '(a . b))) ; NIL (terpri) (write(endp nil)) ; T
Output
When you execute the code, it returns the following result −
NIL NIL T