В схеме или STk функция будет показана как процедура или замыкание, но почему LISP дает ошибку?

В Ubuntu, если я запустил MIT-Scheme, он покажет функцию как процедуру:

1 ]=> (define (sq x) (* x x))

;Value: sq

1 ]=> (sq 3)

;Value: 9

1 ]=> sq

;Value 11: #[compound-procedure 11 sq]

а Беркли STk покажет sq в качестве закрытия:

STk> (define (sq x) (* x x))
sq
STk> (sq 3)
9
STk> sq
#[closure arglist=(x) b73fab48]

Почему в Lisp (Common Lisp clisp), когда я делаю то же самое, вместо этого выдается ошибка, и как я могу показать функцию как значение (значение первого класса / объект)?

[1]> (defun sq(x) (* x x))
SQ
[2]> (sq 3)
9
[3]> sq

*** - SYSTEM::READ-EVAL-PRINT: variable SQ has no value
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of SQ.
STORE-VALUE    :R2      Input a new value for SQ.
ABORT          :R3      Abort main loop

2 ответа

Решение

Common Lisp, в отличие от Scheme, хранит отдельные пространства имен для переменных и имен функций. Пытаться #'sq в кл. Также поищите "Lisp1 vs Lisp2" для бесконечного словоблудия на эту тему.

Показаны синтаксические различия между Scheme и Common Lisp, вызванные различиями в пространстве имен. Схема имеет одно пространство имен для функций и переменных. Common Lisp имеет разные пространства имен для функций и переменных. Имя в Common Lisp может иметь разные значения одновременно: переменная, функция и многое другое.

Определение функции

Эти различия не вызваны различиями в пространстве имен.

Схема: (define (foo a) (+ a 1))

Common Lisp: (defun foo (a) (+ a 1))

Получение объекта функции как значения

Схема: foo

Common Lisp: (function foo) или короче #'foo, Эта форма возвращает объект функции.

Вызов объекта функции с нулевым или большим количеством аргументов.

Схема: первая позиция выражения функции будет оценена.

(let ((bar foo))
  (bar 10))

Common Lisp: нам нужно использовать funcall вызвать объект функции с аргументами. Первый аргумент должен быть объектом функции.

(let ((bar #'foo))
  (funcall bar 10))

Конфликты имен: одно пространство имен против двух пространств имен

Схема: нужно назвать локальные переменные, чтобы они не конфликтовали с определенными функциями:

(define (foo lst)
  (list lst))

Common Lisp: нет конфликта имен между функциями и переменными.

(defun foo (list)
  (list list))
Другие вопросы по тегам