Почему двоеточия предшествуют переменным в Common Lisp - PullRequest
16 голосов
/ 20 декабря 2011

Что означает синтаксис, двоеточие, предшествующее переменной в Common Lisp?Я видел программы с таким, и я приведу здесь пример кода из большого набора функций.

(defun expand (successorf node)
    (mapcar (lambda (action-state-cost)
          (let ((action (car action-state-cost))
                (state (cadr action-state-cost))
                (cost (caddr action-state-cost)))
            (make-node :state state :parent node
                       :action action :path-cost (+ (node-path-cost node) cost)
                       :depth (1+ (node-depth node)))
            ))
      (funcall successorf (node-state node))
      ))

Ответы [ 2 ]

32 голосов
/ 20 декабря 2011

Символы ключевых слов

:foo - это ключевое слово символ .

  • интернировано и экспортированоиз пакета KEYWORD
  • постоянно привязан к себе

Использование

Символы ключевых слов используются, когда необходимо сочетание следующихсвойства:

  • символ - правильная структура данных
  • символы с одинаковыми именами должны быть уникальными (заключая их в пакет) -> пакет KEYWORD
  • различные пакеты не нужны или не нужны -> пакет KEYWORD
  • написание символа должно быть простым, без необходимости указывать их в кавычках -> :foo лучше, чем ':foo
  • возможность действовать как переменная с разными значениями не требуется -> :foo оценивает себя как :foo и только :foo

В Common Lisp обычно символы могут находиться в пакете (видпространства имен).

Неэкспортированный символ bar в пакете foo записывается как foo::bar.Двойное двоеточие находится между именем пакета и именем символа.

Тогда экспортируемый символ записывается как foo:bar.Используется одиночное двоеточие.

Если символ доступен в текущем пакете, то записывается как bar без пакета.

Пакет KEYWORD

Существует специальный пакет под названием KEYWORD.Символ bar в этом пакете просто и всегда записывается как :bar.

Примеры

Эти ключевые символы также имеют следующие интересные свойства: символы автоматическиэкспортируется из пакета KEYWORD (поэтому keyword::bar, keyword:bar, ::bar и :bar являются одним и тем же символом), и они оценивают себя:

CL-USER 5 > :bar
:BAR

CL-USER 6 > (describe :bar)

:BAR is a SYMBOL
NAME          "BAR"
VALUE         :BAR
FUNCTION      #<unbound function>
PLIST         NIL
PACKAGE       #<The KEYWORD package, 0/4 internal, 5830/8192 external>

CL-USER 7 > (eq 'keyword::bar ':bar)
T

CL-USER 8 > (eq :bar ':bar)  ; quoted or unquoted, each subform evaluates to :bar
T

Использование

Символы ключевых слов используются, например, в качестве имен в именованных аргументах:

(defun foo (&key bar) (+ bar 10))

(foo :bar 7)

Обычно они также используются в аргументах для создания экземпляра и структуры.

(defstruct node state parent action)

DEFSTRUCT - это макрос Common Lisp, который генерирует несколько функций.Одной из них является функция MAKE-NODE, которую можно использовать как:

(make-node :state 'open
           :parent some-parent
           :action an-action)

Примечание: иногда данные также могут быть ключевыми словами.Например, в приведенной выше форме состояние может быть :open, а не open:

(make-node :state :open
           :parent some-parent
           :action an-action)
19 голосов
/ 20 декабря 2011

На самом деле они не переменные; это ключевые слова. Это особый вид эффективного токена, похожего на «атомы» в других языках. Это удобный встроенный способ передачи именованных (и почти всегда необязательных) параметров в вызов функции.

http://www.gigamonkeys.com/book/functions.html описывает синтаксис вызовов функций.

...