]]> ]]>

Corman Common Lisp 3.0

Версия реализации Corman Common Lisp языка программирования Lisp

Ключевые особенности версии 3.0:

  • Улучшение производительности и стабильности кода математических вычислений.
  • Интеграция с .NET.
  • Многочисленные исправления ошибок и незначительные изменения в функциях ядра, сборке мусора, ANSI-совместимости и т.д.
  • Улучшения среды разработки.

Примеры:

Hello, World!:

Результат выполнения этого кода в интерактивном режиме имеет следующий вид:

Hello, World!
NIL

Первая строка содержит стандартный поток вывода, вторая — значение, возвращаемое кодом (в данном случае — его отсутствие).

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

Факториал:

Этот пример использует рекурсивное определение факториала, естественное для Lisp. Демонстрирует следующие особенности языка:

  • математические операторы: (- n 1) — это префиксная запись, эквивалентная инфиксной записи n-1;
  • операторы сравнения: (= n 0) возвращает T, если n равно нулю, и nil (используется как false) в противном случае;
  • условный оператор if: выражения в Lisp определяются по скобкам и могут записыватся в несколько строк;
  • определение функции с использованием defun;
  • макрос Common Lisp loop;
  • спецификации формата вывода в format: ~D соответствует целому числу, а ~% — концу строки.
(defun factorial (n)
    (if (= n 0)
        1
        (* n (factorial (- n 1)))
    )
)

(loop for i from 0 to 16
    do (format t "~D! = ~D~%" i (factorial i))
)

Числа Фибоначчи:

(defun fibonacci (n)
    (if (< n 3)
        1
        (+ (fibonacci (- n 1)) (fibonacci (- n 2)))
    )
)

(loop for i from 1 to 16
    do (format t "~D, " (fibonacci i))
    finally (format t "...~%")
)

Числа Фибоначчи:

Этот пример использует итеративное определение чисел Фибоначчи без запоминания, выраженное через рекурсивный вызов функции fib-iter.

(defun fibonacci (n)
    (defun fib-iter (a b count)
        (if (zerop count)
            b
            (fib-iter (+ a b) a (- count 1))
        )
    )
    (fib-iter 1 0 n)
)

(loop for i from 1 to 16
    do (format t "~D, " (fibonacci i))
    finally (format t "...~%")
)

Факториал:

Внутренний цикл с операцией collect создает список чисел от 1 до n, после чего к нему применяется операция *.

(loop for n from 0 to 16
   do (format t "~D! = ~D~%" n 
        (apply '* (loop for i from 1 to n 
                        collect i)) ) )

Квадратное уравнение:

Common Lisp позволяет работать с комплексными числами и выводить их на печать в формате #C(real imag). Функция write-to-string преобразует число в строку.

(defun quadratic-roots-2 (A B C)
  (cond ((= A 0) (string "Not a quadratic equation."))
    (t
    (let ((D (- (* B B) (* 4 A C))))
      (cond ((= D 0) (concatenate 'string "x = " (write-to-string (/ (+ (- B) (sqrt D)) (* 2 A)))))
        (t
        (values (concatenate 'string "x1 = " (write-to-string (/ (+ (- B) (sqrt D)) (* 2 A))))
                (concatenate 'string "x2 = " (write-to-string (/ (- (- B) (sqrt D)) (* 2 A)))))))))))

В закладки: ]]> Пиктограмма del.icio.us Пиктограмма БобрДобр.ru Пиктограмма Memori.ru Пиктограмма МоёМесто.ru ]]>