Когда использовать '(или кавычка) в Lisp?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
106
задан nbro 5 September 2017 в 19:11
поделиться

5 ответов

Короткий ответ Обход правила оценки по умолчанию и делают не , оценивают выражение (символ или s-exp), передавая его функции точно, как введено.

Длинный Ответ: Правило

Оценки По умолчанию, Когда постоянный клиент (я приеду в тот позже) функция будет вызвана, все аргументы, передало ей, оценены. Это означает, что можно записать это:

(* (+ a 2)
   3)

, Который в свою очередь оценивает (+ a 2) путем оценки a и 2. Значение символа a ищется в текущем наборе привязки переменной, и затем заменяется. Скажите a, в настоящее время связывается со значением 3:

(let ((a 3))
  (* (+ a 2)
     3))

Мы добрались бы (+ 3 2), + тогда вызывается на 3 и 2 получения 5. Наша исходная форма теперь (* 5 3) получение 15.

Уже Объясняют quote!

Хорошо. Как замечено выше, все аргументы функции оценены, поэтому если требуется передать символ a и не его значение, Вы не хотите оценивать его. Символы Lisp могут удвоиться и как их значения и как маркеры, где Вы на других языках использовали бы строки, такие как ключи к хэш-таблицам.

Это - то, где quote входит. Скажите, что Вы хотите вывести выделения ресурса на печать из приложения Python, а скорее сделать графическое изображение в Lisp. Имейте свое приложение Python, делают что-то вроде этого:

print("'(")
while allocating:
    if random.random() > 0.5:
        print(f"(allocate {random.randint(0, 20)})")
    else:
        print(f"(free {random.randint(0, 20)})")
    ...
print(")")

Предоставление Вас произвело сходство с этим (немного украшенный):

'((allocate 3)
  (allocate 7)
  (free 14)
  (allocate 19)
  ...)

Помнят то, что я сказал [приблизительно 1 120] ("галочка"), вызывающая правило по умолчанию не применяться? Хороший. То, что иначе произошло бы, - то, что значения [1 121] и free ищутся, и мы не хотим это. В нашем Lisp мы хотим сделать:

(dolist (entry allocation-log)
  (case (first entry)
    (allocate (plot-allocation (second entry)))
    (free (plot-free (second entry)))))

Для данных, данных выше, следующая последовательность вызовов функции была бы сделана:

(plot-allocation 3)
(plot-allocation 7)
(plot-free 14)
(plot-allocation 19)

, Но Что относительно [1 123]?

ну, иногда Вы делаете , хотят оценить аргументы. Скажите, что у Вас есть изящная функция, управляющая числом и строкой и возвращающая список получающегося... вещи. Давайте сделаем неудачное начало:

(defun mess-with (number string)
  '(value-of-number (1+ number) something-with-string (length string)))

Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER (1+ NUMBER) SOMETHING-WITH-STRING (LENGTH STRING))

Эй! Это не то, что мы хотели. Мы хотим к [1 142] выборочно , оценивают некоторые аргументы и оставляют другие как символы. Попробуйте № 2!

(defun mess-with (number string)
  (list 'value-of-number (1+ number) 'something-with-string (length string)))

Lisp> (mess-with 20 "foo")
(VALUE-OF-NUMBER 21 SOMETHING-WITH-STRING 3)

Не Всего quote, Но и backquote

Намного лучше! Инцидентным образом этот шаблон так распространен в (главным образом) макросах, что существует специальный синтаксис для того, чтобы сделать просто это. Одинарная левая кавычка:

(defun mess-with (number string)
  `(value-of-number ,(1+ number) something-with-string ,(length string)))

Это похоже на использование quote, но с опцией явно оценить некоторые аргументы путем добавления префикса их запятую. Результат эквивалентен использованию list, но если Вы генерируете код от макроса, Вы часто только хотите оценить мелкие детали возвращенного кода, таким образом, одинарная левая кавычка больше подходит. Для более коротких списков, list может быть более читаемым.

Эй, Вы Забыли [приблизительно 1 129]!

Так, где это оставляет нас? О, право, что делает quote на самом деле, делает? Это просто возвращает свой неоцененный аргумент (аргументы)! Помните то, что я сказал в начале о регулярных функциях? Оказывается, что для некоторых операторов/функций нужно к [1 143] не , оценивают их аргументы. Такой, как будто - Вы еще не хотели бы ответвление быть оцененными, если бы оно не было взято, правильно? Так называемый специальные операторы , вместе с макросами, работают как этот. Специальные операторы являются также "аксиомой" языка - минимального ряда правил - на который можно реализовать остальную часть Lisp путем объединения их вместе по-разному.

Назад к [1 131], хотя:

Lisp> (quote spiffy-symbol)
SPIFFY-SYMBOL

Lisp> 'spiffy-symbol ; ' is just a shorthand ("reader macro"), as shown above
SPIFFY-SYMBOL

Выдерживают сравнение с (на языке Common LISP Стального Банка):

Lisp> spiffy-symbol
debugger invoked on a UNBOUND-VARIABLE in thread #<THREAD "initial thread" RUNNING   {A69F6A9}>:
  The variable SPIFFY-SYMBOL is unbound.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-INT:SIMPLE-EVAL-IN-LEXENV SPIFFY-SYMBOL #<NULL-LEXENV>)
0] 

, поскольку нет никакого spiffy-symbol в текущей области!

Подведение Итогов

quote, backquote (с запятой), и list является некоторыми инструментами, которые Вы используете для создания списков, которые не являются только списками значений, но и поскольку Вы замеченный можете использоваться в качестве легкого веса (никакая потребность определить struct) структуры данных!

, Если Вы хотите узнать больше, я рекомендую книге Peter Seibel Практический язык Common LISP для практического подхода к изучению Lisp, если Вы уже в программирование в целом. В конечном счете на Вашей поездке Lisp, Вы начнете использовать пакеты также. Ron Garret Руководство Идиота по Пакетам языка Common LISP даст Вам хорошее объяснение тех.

Счастливое взламывание!

166
ответ дан Mateen Ulhaq 24 November 2019 в 03:47
поделиться

Это говорит, "не оценивают меня". Например, если Вы хотели использовать список в качестве данных, и не в качестве кода, Вы поместили кавычку перед ним. Например,

(print '(+ 3 4)) печать" (+ 3 4)", тогда как (print (+ 3 4)) печать "7"

49
ответ дан Adam Rosenfield 24 November 2019 в 03:47
поделиться

Другие люди ответили на этот вопрос превосходно, и Matthias Benkard поднимает превосходное предупреждение.

НЕ ИСПОЛЬЗУЮТ КАВЫЧКУ ДЛЯ СОЗДАНИЯ СПИСКОВ, КОТОРЫЕ ВЫ ПОЗЖЕ ИЗМЕНИТЕ. Спецификация позволяет компилятору рассматривать заключенные в кавычки списки как константы. Часто, компилятор оптимизирует константы путем создавания единственной стоимости для них в памяти и затем ссылки, что единственное значение от всех местоположений, где константа появляется. Другими словами, это может рассматривать константу как анонимная глобальная переменная.

Это может вызвать очевидные проблемы. При изменении константы она может изменить другое использование той же константы в абсолютно несвязанном коде. Например, можно сравнить некоторую переменную с' (1 1) в некоторой функции, и в совершенно другой функции, запустить список с' (1 1) и затем добавить больше материала к нему. После выполнения этих функций можно найти, что первая функция не соответствует вещам правильно больше, потому что это теперь пытается сравнить переменную с' (1 1 2 3 5 8 13), который является что вторая возвращенная функция. Эти две функции абсолютно не связаны, но они имеют эффект друг на друга из-за использования констант. Еще более сумасшедшие плохие эффекты могут произойти, как совершенно нормальное повторение списка внезапно бесконечное цикличное выполнение.

кавычка Использования, когда Вам нужен постоянный список, такой что касается сравнения. Используйте список при изменении результата.

18
ответ дан Xanthir 24 November 2019 в 03:47
поделиться

В одном ответе на этот вопрос говорится, что КАВЫЧКА “creates перечисляет данные structures”. Это не совершенно правильно. КАВЫЧКА более фундаментальна, чем это. На самом деле КАВЫЧКА является тривиальным оператором: Его цель к , предотвращают что-либо от случая вообще. В частности, это ничего не создает.

то, Какую (КАВЫЧКУ X) говорит, в основном “don't, делают что-либо, просто дают мне, X.” X не должен быть списком как в (КАВЫЧКА (B C)) или символ как в (НЕЧТО КАВЫЧКИ). Это может быть любой объект вообще. Действительно, результат оценки списка, который производится (СПИСОК 'ЗАКЛЮЧАЮТ НЕКОТОРЫМ В КАВЫЧКИ - ОБЪЕКТ) будет всегда просто возвращать НЕКОТОРЫХ - ОБЪЕКТ, независимо от того, что это.

Теперь, причина, которая (КАВЫЧКА (B C)) кажется, как будто она создала список, элементы которого являются A, B, и C - то, что такой список действительно - то, что она возвращает; но в то время, когда форма КАВЫЧКИ оценена, список обычно уже был существующим некоторое время (как компонент формы КАВЫЧКИ!), созданный или загрузчиком или читателем до выполнения кода.

Одна импликация этого, которое имеет тенденцию сбивать с толку новичков справедливо часто, - то, что очень неблагоразумно изменить список, возвращенный формой КАВЫЧКИ. Данные, возвращенные КАВЫЧКОЙ, нужно, во всех отношениях, рассмотреть как часть код выполняемый и нужно поэтому рассматривать как только для чтения!

14
ответ дан Matthias Benkard 24 November 2019 в 03:47
поделиться

Кавычка предотвращает выполнение или оценку формы, поворачивая его вместо этого в данные. В целом можно выполнить данные к тому времени eval'ing это.

кавычка создает структуры данных списка, например, следующее эквивалентны:

(quote a)
'a

Это может также использоваться для создания списков (или деревья):

(quote (1 2 3))
'(1 2 3)

Вы являетесь, вероятно, лучшими от получения книги introductary по шепелявости, такой как Практический язык Common LISP (который доступен для чтения онлайн).

11
ответ дан Kyle Burton 24 November 2019 в 03:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: