## Код:
```
(declaim (optimize (speed 3) (safety 0)))

(deftype эрзац-число () 'fixnum)

(defparameter *максимальное-эрзац-число* most-positive-fixnum)

;; 2 бита у 64-разрядных маленьких чисел в 64-разрядном SBCL заняты тегом типа
;; это два нуля, что и даёт возможность их складывать.
(assert (= *максимальное-эрзац-число* (- (expt 2 62) 1)))

(declaim (ftype (function (эрзац-число эрзац-число) эрзац-число) эрзац-сумма-эрзац-чисел))

(defun эрзац-сумма-эрзац-чисел (a b)
  (declare (эрзац-число a)
           (эрзац-число b))
  (the fixnum (+ a b)))

(print (эрзац-сумма-эрзац-чисел *максимальное-эрзац-число* *максимальное-эрзац-число*))
```


Далее,
## Код:
```
; disassembly for эрзац-сумма-эрзац-чисел
; Size: 21 bytes. Origin: #x2339C1CA
; CA:       498B442460       mov RAX, [R12+96]                ; no-arg-parsing entry point
                                                              ; thread.binding-stack-pointer
; CF:       488945F8         mov [RBP-8], RAX
; D3:       4801F9           add RCX, RDI
; D6:       488BD1           mov RDX, RCX
; D9:       488BE5           mov RSP, RBP
; DC:       F8               clc
; DD:       5D               pop RBP
; DE:       C3               ret
nil
```

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

Когда я пишу на лиспе, я не пользуюсь эрзац-числами, поэтому не могу сказать, как отловить переполнение и возможно ли это. Данный код просто сбрасывает флаг переноса и печатает -2. Код, отлавливающий выход за пределы диапазона, пишется просто, но машинный код будет сложнее. И по сути дела мой код работает в UB, поскольку я написал safety 0, в этом случае поведение при переполнении скорее всего является UB.

В большинстве языков используются именно эрзац-числа. Я не думаю, что язык без настоящих чисел можно называть языком высокого уровня. На бумажке можно сложить очень большие числа в столбик, а на Обероне это нельзя сделать. Странно, можно ли называть это языком высокого уровня. Питон, видимо, является языком высокого уровня и в нём тоже по умолчанию используются настоящие числа.  Однако сложение настоящих чисел - это сложно, поскольку для этого требуется динамическая память. Обычно оно реализовано в виде библиотеки (и в A2 вроде есть такая библиотека). Поэтому вполне оправдано, что на мелких машинах используются эрзац-числа вместо настоящих. Конечно, и лисп можно засадить в засаду, если дать число, которое не поместится в памяти, однако гугл легко помещается:
## Код:
```
157 cl-user>(+ (expt 10 100) 1)
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
```

И да, числа с плавающей точкой в Common Lisp - тоже эрзац, но есть хотя бы рациональные дроби:
## Код:
```
>(expt 5/6 3)
125/216
```
