Этот вопрос касается правил кодирования, лучших практик и стиля в производстве, критически важного кода Common- Lisp. Я просмотрел Руководство по стилю Google Common- Lisp (http://tinyurl.com/qfvnqcx), но не нашел ничего четкого решения моей конкретной проблемы, которое я выражаю на примере и наоборот на C/С++, Java и т.д. Я также быстро просмотрел базы кода Common- Lisp на Github, и я не видел много проверок аргументов и проверки промежуточного значения, которые я вижу в C/С++, Java и т.д.
В моем магазине мы очень привыкли проверять аргументы и другие значения и принимать ранние выходы, когда аргументы не соответствуют контрактам/предварительным условиям и т.д. Например, рассмотрим следующее (надуманное, несовершенное, типичное, но, пожалуйста, - не-время-время-критикуя, микро-пример, который предваряет пример CL):
ErrorCode o_symb_to_g_symb (char * symb, uint len)
{ if (len < 2) { return ERROR_LENGTH; }
if (symb[0] != 'O' || symb[1] != '!') { return ERROR_SYNTAX; }
char * result = (char *) malloc (len + 1);
if (NULL == result) { return ERROR_MALLOC; }
if (result != strncpy (result, symb, len + 1))
{ return ERROR_STRNCPY; }
result[0] = 'G';
return result; }
Это примерно то же самое, что и код Дуга Хойта из "Let Over Lambda", стр. 67, только позаботится как можно больше по пути (http://letoverlambda.com/).
(defun o!-symbol-to-g!-symbol (s)
(symb "G!"
(subseq (symbol-name s) 2))))
Вопрос в том, делает ли реальный производственный код в Common Lisp больше проверки. Например, было бы разумно написать явный код, чтобы проверить, что s фактически является строкой и на самом деле достаточно длинной, и на самом деле имеет "O!" как его первые два символа.
Является ли этот код минуя всю эту паранойю только потому, что она педагогическая? Будет ли такой же код в критически важном производственном развертывании с большей вероятностью иметь проверки на паранойю (моя светлая конструкция Github для кода CL предложит "нет" )? Если код CL реального мира не имеет тенденций к параноику, почему бы и нет? Является ли практика углового или исчерпывающего тестирования более распространенной, чем кажется?
Короче говоря, я очень озадачен различием стилей. Реальный, критически важный C-код имеет тенденцию быть суперпараноидальным. Я не вижу то же самое в CL. Возможно, я не смотрю на правильные кодовые базы? Возможно, я не читал правильные книги? Ответ на этот вопрос, кажется, нелегко найти в Google.