“Никакой MAKE-LOAD-FORM” ошибка с языком Common LISP OpenMCL

Каждый раз, когда вы находите очень повторяющийся код, всегда думайте LOOP.

Ниже приведен пользователь может редактировать свои значения. Это также значительно уменьшает ваш код.

$('form').on('input', e => {
    var letters = ['a', 'b', 'c', 'd', 'e', 'f'];
    letters.forEach(letter => {
        let field = $(e.target);
        field.val(field.val().replace(/[^0-9]/g, ''));
        if(field.val().length == field.attr('maxlength')) { field.nextAll('input').first().focus(); }
    });
});

Скрипка .

Примечания:

  • Прослушивать входное событие; у него есть преимущество в том, что он охватывает все события, которые вы прослушивали, и, что особенно важно, запускает после нажатия клавиши (это означает, что вы можете быть уверены в том, что получите последнее, полное значение из поля)
  • избегать повторяющегося кода; цикл позволяет нам писать бизнес-логику один раз, а не многократно
  • , нет необходимости предотвращать действие по умолчанию для события
  • с помощью nextAll('input').first(), мы можем быть уверены в получении следующего [ 112], будь то следующий брат или, как в случае с третьим входом, разделенные другим типом элемента

7
задан JasonMArcher 11 May 2015 в 19:26
поделиться

1 ответ

Когда ОБЪЕКТЫ СТРУКТУРЫ (и некоторые другие типы объектов) появляются как литеральные, постоянные объекты в коде, обрабатываемом ФАЙЛОМ КОМПИЛЯЦИИ, ФАЙЛ КОМПИЛЯЦИИ должен знать, как расположить, что, когда получающийся двоичный файл загружается, "эквивалентный" объект создается. Существует много возможных определений "эквивалентных": иногда, важно, чтобы компоненты загруженного объекта совместно использовали структуру с другими объектами, иногда важно, чтобы инициализация произошла определенным способом, и иногда ни одна из этих вещей не важна. Чтобы определить, как воссоздать постоянный объект, ФАЙЛ КОМПИЛЯЦИИ вызывает родовую функцию MAKE-LOAD-FORM; это поведение должно быть описано в любой ссылке CL или учебном руководстве. (Ссылка или учебное руководство должны также отметить, что реализация не может определить MAKE-LOAD-FORM по умолчанию, который был бы применим ко всем экземплярам КЛАССА СТРУКТУРЫ или СТАНДАРТНОГО КЛАССА, и должен также отметить, что MAKE-LOAD-FORM-SAVING-SLOTS является удобной функцией для использования в MAKE-LOAD-FORM для объектов, инициализация которых не должна быть сложной, например:

(defmethod make-load-form ((p point) &optional env)
  (declare (ignore env))
  (make-load-form-saving-slots p))

Обратите внимание, что тот метод должен быть определен во время компиляции, так, чтобы ФАЙЛ КОМПИЛЯЦИИ мог назвать его, чтобы определить, как сохранить постоянный Точечный объект.

Ни одно из этого не CCL-конкретно. То, что могло бы быть, является вопросом, которого вещами являются постоянные, литеральные объекты и который не вещи.

В коде как:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () a-point)

компилятор позволил (но не потребовал) заменять значением A-точки для ссылки на него в функциональном ВОЗВРАТЕ ТОЧКИ. (Если бы компилятор делает так, который означал бы, что существует литеральный/постоянный Точечный объект в коде, скомпилированном, и ФАЙЛ КОМПИЛЯЦИИ должен был бы назвать MAKE-LOAD-FORM, чтобы определить, как объект должен быть сохранен и загружен; если компилятор не делает этой замены, то MAKE-LOAD-FORM не должны называть в этом примере.)

Делает ли реализация этот вид замены или не до реализации. Спецификация также оставляет это неуказанным относительно того, оценена ли форма значения в форме DEFCONSTANT во время компиляции, время загрузки или оба, и отмечает, что заботу должен соблюдать (пользователь), чтобы гарантировать, что выражение всегда оценивает к тому же значению.

CCL обычно пытается оценить форму значения DEFCONSTANT во время компиляции и довольно агрессивен о заменении значениями именованных констант для ссылок на них; в некоторых случаях это означает, что MAKE-LOAD-FORM на классах значений констант должен быть определен. Другие реализации могут быть менее готовы сделать эту замену на некоторые типы объектов. Обе стратегии корректны, и портативный код не может принять, какие стратегии сопровождаются (хотя много предположительно портативного кода, конечно, делает такие предположения.)

Другое отношение вещей, определенных DEFCONSTANT, походит на главным образом вероятную причину этого вида вещи (неожиданные вызовы в MAKE-LOAD-FORM который ничей побеспокоенный определить). Можно избежать некоторых из этих проблем способом, которые должны быть портативными путем выполнения:

(defconstant a-point (make-point :x 0 :y 0 :z 200))

(defun return-a-point () (load-time-value (symbol-value 'a-point)))

Это будет иметь подобный эффект к простому разрешению реализации, которая хочет сделать так (как CCL делает) сделать постоянную замену, но использование временной стоимости ЗАГРУЗКИ гарантирует, что постоянная величина оценена только во время загрузки (и что MAKE-LOAD-FORM не будет включен.)

8
ответ дан 7 December 2019 в 05:32
поделиться
Другие вопросы по тегам:

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