Полное руководство по основам языка Common Lisp

Это подробное руководство по основам языка Common Lisp, включающее примеры программ, которые демонстрируют различные концепции программирования на Common Lisp.

Назад

Первая программа на Common Lisp

Каждая программа на Common Lisp начинается с функции defun:


(defun main ()
  (format t "Hello, World!~%"))

(main)
        

Типы данных

Основные типы данных в Common Lisp:

Арифметические операции

Пример использования арифметических операций в Common Lisp:


(defun arithmetic-operations ()
  (let ((a 10)
        (b 20))
    (format t "Sum: ~d~%" (+ a b))
    (format t "Difference: ~d~%" (- b a))
    (format t "Product: ~d~%" (* a b))
    (format t "Division: ~d~%" (/ b a))
    (format t "Modulus: ~d~%" (mod b a))))

(arithmetic-operations)
        

Ввод/Вывод

Ввод и вывод данных с использованием read и format:


(defun read-input ()
  (format t "Enter an integer: ")
  (let ((num (read)))
    (format t "You entered: ~d~%" num)))

(read-input)
        

Условные операторы

Пример использования оператора if:


(defun conditional-example ()
  (format t "Enter an integer: ")
  (let ((num (read)))
    (cond
      ((> num 0) (format t "The number is positive.~%"))
      ((< num 0) (format t "The number is negative.~%"))
      (t (format t "The number is zero.~%")))))

(conditional-example)
        

Циклы

Пример цикла loop:


(defun loop-example ()
  (loop for i from 0 to 4
        do (format t "i = ~d~%" i)))

(loop-example)
        

Массивы

Пример работы с массивами:


(defun array-example ()
  (let ((arr #(1 2 3 4 5)))
    (loop for i from 0 to (1- (length arr))
          do (format t "arr[~d] = ~d~%" i (aref arr i)))))

(array-example)
        

Функции

Пример создания и использования функции:


(defun greet ()
  (format t "Hello from the function!~%"))

(greet)
        

Классы и объекты

Пример создания и использования классов:


(defclass rectangle ()
  ((width :initarg :width :accessor rectangle-width)
   (height :initarg :height :accessor rectangle-height)))

(defun area (rect)
  (* (rectangle-width rect) (rectangle-height rect)))

(defun display-rectangle (rect)
  (format t "Width: ~a, Height: ~a, Area: ~a~%"
          (rectangle-width rect)
          (rectangle-height rect)
          (area rect)))

(let ((rect (make-instance 'rectangle :width 5 :height 3)))
  (display-rectangle rect))
        

Наследование

Пример использования наследования в Common Lisp:


(defclass animal ()
  ())

(defclass dog (animal)
  ())

(defmethod speak ((a animal))
  (format t "Animal makes a sound.~%"))

(defmethod speak ((d dog))
  (format t "Dog barks.~%"))

(let ((my-dog (make-instance 'dog)))
  (speak my-dog))
        

Указатели

В Common Lisp указатели не используются напрямую, так как язык управляет памятью автоматически.

Динамическое выделение памяти

В Common Lisp нет прямого управления памятью, используются автоматическое управление памятью и сборщик мусора.

Работа с файлами

Пример работы с файлами в Common Lisp:


(defun write-file ()
  (with-open-file (stream "example.txt" :direction :output :if-exists :supersede)
    (format stream "Hello, file!~%")))

(defun read-file ()
  (with-open-file (stream "example.txt" :direction :input)
    (loop for line = (read-line stream nil)
          while line
          do (format t "~a~%" line)))

(write-file)
(read-file)