TL; DR: №. Современные системы lisp имеют намного больше примитивов, чем первый lisp, и новые примитивы необходимы для каждого нового примитивного типа данных.
У первого Лиспа не было номеров, но оно было полным. Это означает, что он может делать любые вычисления, которые возможны на любом другом языке, но это не значит, что это было бы практично. Число не было трудно подражать, но расчеты были медленными. Сегодня есть слухи о медленной арифметике, датируемой pre Lisp 1.5.
Когда я сделал свой первый интерпретатор lisp, мне не сильно понравились цифры. Это не очень интересный аспект переводчика. Я тем не менее реализовать fibonacci
в качестве примера, и вот как это выглядит:
;; This is NOT Common Lisp code. It's Zozotez
(setq + (lambda (x y)
(if x (cons (car x)
(+ (cdr x) y))
y)))
(setq - (lambda (z w)
(if w (- (cdr z)
(cdr w))
z)))
(setq fibonacci
(lambda (n a1 a2)
(if n
(fibonacci (- n '(1))
a2
(+ a2 a1))
a1)))
(fibonacci '(1 1 1 1 1 1 1 1 1)() '(1))
; ==> (1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
Нет номеров!(1
на моем языке является символом, поэтому его нужно котировать, иначе он будет оцениваться как переменная)
В качестве альтернативной системы чисел я применил систему позиционирования, в значительной степени похожую на то, как мы пишем числа с одинаковыми правилами для добавления/умножения и т. д. Возможно, чуть быстрее, чем lits длины n, но сложнее сделать.
Если у Lisp есть закругления, вы можете сделать церковные цифры. Используя то же самое, что и лямбда-исчисление, вы можете вычислить что угодно, просто закрыв. Вам нужен только один примитив, lambda
. (Опять же, не самый простой для работы)
Lisp с этими семью функциями не имеет чисел. Нет 1 и нет 2. Таким образом (плюс 1 2) не будет работать. –
это 1: '(())'. И это 2: '(()())'. –