fork download
  1. (defun lisp-interpreter (expression)
  2. "Простейший интерпретатор Lisp."
  3. (let ((global-environment '()))
  4.  
  5. (labels (
  6. (evaluate (expr env)
  7. (cond
  8. ((numberp expr) expr)
  9. ((symbolp expr) (or (cdr (assoc expr env)) (cdr (assoc expr global-environment)) expr)) ; Ищем значение переменной
  10. ((listp expr)
  11. (let ((function (car expr))
  12. (arguments (cdr expr)))
  13. (apply-function function arguments env)))
  14. (t (error "Неизвестный тип выражения: ~A" expr))))
  15.  
  16. (lookup (symbol env)
  17. (assoc symbol env))
  18.  
  19. (apply-function (function arguments env)
  20. (cond
  21. ((eql function 'quote) (car arguments))
  22. ((eql function 'car) (car (evaluate (car arguments) env)))
  23. ((eql function 'cdr) (cdr (evaluate (car arguments) env)))
  24. ((eql function 'cons) (cons (evaluate (car arguments) env) (evaluate (cadr arguments) env)))
  25. ((eql function '+) (apply '+ (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  26. ((eql function '-) (apply '- (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  27. ((eql function '*) (apply '* (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  28. ((eql function '/) (apply '/ (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  29. ((eql function '=) (= (evaluate (car arguments) env) (evaluate (cadr arguments) env)))
  30. ((eql function '<) (< (evaluate (car arguments) env) (evaluate (cadr arguments) env)))
  31. ((eql function '>) (> (evaluate (car arguments) env) (evaluate (cadr arguments) env)))
  32. ((eql function 'list) (mapcar #'(lambda (arg) (evaluate arg env)) arguments)) ; Реализация list
  33. ((eql function 'expt) (expt (evaluate (car arguments) env) (evaluate (cadr arguments) env))) ; Power function
  34. ((eql function 'sqrtn) ; Корень n-й степени: (sqrtn x n)
  35. (let ((x (evaluate (car arguments) env))
  36. (n (evaluate (cadr arguments) env)))
  37. (expt x (/ 1.0 n)))) ; Используем экспоненту для вычисления корня
  38. ((eql function 'lambda) ; Лямбда-выражение
  39. (let ((params (cadr function))
  40. (body (caddr function))
  41. (evaluated-args (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  42. (evaluate body (append (mapcar #'cons params evaluated-args) env))))
  43. ((eql function 'if)
  44. (if (evaluate (car arguments) env)
  45. (evaluate (cadr arguments) env)
  46. (evaluate (caddr arguments) env))) ; if
  47. ((eql function 'defun)
  48. (let ((name (car arguments))
  49. (params (cadr arguments))
  50. (body (caddr arguments)))
  51. (setf global-environment (acons name `(lambda ,params ,body) global-environment))
  52. name))
  53. ((eql function 'setq)
  54. (let ((symbol (car arguments))
  55. (value (evaluate (cadr arguments) env)))
  56. (setf global-environment (acons symbol value global-environment))
  57. value))
  58. (t ; Пользовательская функция (из глобального окружения)
  59. (let ((func (lookup function global-environment)))
  60. (if func
  61. (apply-function (eval (cdr func)) arguments env)
  62. (error "Неизвестная функция: ~A" function))))
  63. )))
  64.  
  65. (evaluate expression global-environment))))
  66.  
  67. ;; Примеры использования
  68. (format t "Результат: ~A~%" (lisp-interpreter '(cons (car (cdr (quote (e r t w)))) (cons (cdr (quote (g h 6))) (quote ())))))
  69. (format t "Результат: ~A~%" (lisp-interpreter '(+ 2 (* 3 4))))
  70. (format t "Результат: ~A~%" (lisp-interpreter '(- 10 (/ 6 2))))
  71. (format t "Результат: ~A~%" (lisp-interpreter '(if (> 5 3) 10 20)))
  72. (format t "Результат: ~A~%" (lisp-interpreter '(if (= 5 3) 10 20)))
  73. (format t "Результат: ~A~%" (lisp-interpreter '(car (list 1 2 3))))
  74. (format t "Результат: ~A~%" (lisp-interpreter '(sqrtn 16 2))) ; Корень квадратный из 16
  75. (format t "Результат: ~A~%" (lisp-interpreter '(sqrtn 27 3))) ; Корень кубический из 27
  76. (format t "Результат: ~A~%" (lisp-interpreter '(expt 2 3))) ; 2 в степени 3
  77.  
Success #stdin #stdout #stderr 0.02s 9600KB
stdin
Standard input is empty
stdout
Результат: (R (H 6))
Результат: 14
Результат: 7
Результат: 10
Результат: 20
Результат: 1
Результат: 4.0
Результат: 3.0
Результат: 8
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x14d1fac00000 - 0x14d1faee4fff
  0x14d1fb000000 - 0x14d1fb002fff
  0x14d1fb003000 - 0x14d1fb201fff
  0x14d1fb202000 - 0x14d1fb202fff
  0x14d1fb203000 - 0x14d1fb203fff
  0x14d1fb215000 - 0x14d1fb239fff
  0x14d1fb23a000 - 0x14d1fb3acfff
  0x14d1fb3ad000 - 0x14d1fb3f5fff
  0x14d1fb3f6000 - 0x14d1fb3f8fff
  0x14d1fb3f9000 - 0x14d1fb3fbfff
  0x14d1fb3fc000 - 0x14d1fb3fffff
  0x14d1fb400000 - 0x14d1fb403fff
  0x14d1fb404000 - 0x14d1fb603fff
  0x14d1fb604000 - 0x14d1fb604fff
  0x14d1fb605000 - 0x14d1fb605fff
  0x14d1fb61c000 - 0x14d1fb61dfff
  0x14d1fb61e000 - 0x14d1fb62dfff
  0x14d1fb62e000 - 0x14d1fb661fff
  0x14d1fb662000 - 0x14d1fb798fff
  0x14d1fb799000 - 0x14d1fb799fff
  0x14d1fb79a000 - 0x14d1fb79cfff
  0x14d1fb79d000 - 0x14d1fb79dfff
  0x14d1fb79e000 - 0x14d1fb79ffff
  0x14d1fb7a0000 - 0x14d1fb7a0fff
  0x14d1fb7a1000 - 0x14d1fb7a2fff
  0x14d1fb7a3000 - 0x14d1fb7a3fff
  0x14d1fb7a4000 - 0x14d1fb7a4fff
  0x14d1fb7a5000 - 0x14d1fb7a5fff
  0x14d1fb7a6000 - 0x14d1fb7b3fff
  0x14d1fb7b4000 - 0x14d1fb7c1fff
  0x14d1fb7c2000 - 0x14d1fb7cefff
  0x14d1fb7cf000 - 0x14d1fb7d2fff
  0x14d1fb7d3000 - 0x14d1fb7d3fff
  0x14d1fb7d4000 - 0x14d1fb7d4fff
  0x14d1fb7d5000 - 0x14d1fb7dafff
  0x14d1fb7db000 - 0x14d1fb7dcfff
  0x14d1fb7dd000 - 0x14d1fb7ddfff
  0x14d1fb7de000 - 0x14d1fb7defff
  0x14d1fb7df000 - 0x14d1fb7dffff
  0x14d1fb7e0000 - 0x14d1fb80dfff
  0x14d1fb80e000 - 0x14d1fb81cfff
  0x14d1fb81d000 - 0x14d1fb8c2fff
  0x14d1fb8c3000 - 0x14d1fb959fff
  0x14d1fb95a000 - 0x14d1fb95afff
  0x14d1fb95b000 - 0x14d1fb95bfff
  0x14d1fb95c000 - 0x14d1fb96ffff
  0x14d1fb970000 - 0x14d1fb997fff
  0x14d1fb998000 - 0x14d1fb9a1fff
  0x14d1fb9a2000 - 0x14d1fb9a3fff
  0x14d1fb9a4000 - 0x14d1fb9a9fff
  0x14d1fb9aa000 - 0x14d1fb9acfff
  0x14d1fb9af000 - 0x14d1fb9affff
  0x14d1fb9b0000 - 0x14d1fb9b0fff
  0x14d1fb9b1000 - 0x14d1fb9b1fff
  0x14d1fb9b2000 - 0x14d1fb9b2fff
  0x14d1fb9b3000 - 0x14d1fb9b3fff
  0x14d1fb9b4000 - 0x14d1fb9bafff
  0x14d1fb9bb000 - 0x14d1fb9bdfff
  0x14d1fb9be000 - 0x14d1fb9befff
  0x14d1fb9bf000 - 0x14d1fb9dffff
  0x14d1fb9e0000 - 0x14d1fb9e7fff
  0x14d1fb9e8000 - 0x14d1fb9e8fff
  0x14d1fb9e9000 - 0x14d1fb9e9fff
  0x14d1fb9ea000 - 0x14d1fb9eafff
  0x55b13395b000 - 0x55b133a4bfff
  0x55b133a4c000 - 0x55b133b55fff
  0x55b133b56000 - 0x55b133bb5fff
  0x55b133bb7000 - 0x55b133be5fff
  0x55b133be6000 - 0x55b133c16fff
  0x55b133c17000 - 0x55b133c1afff
  0x55b134900000 - 0x55b134920fff
  0x7fff7c4f6000 - 0x7fff7c516fff
  0x7fff7c574000 - 0x7fff7c577fff
  0x7fff7c578000 - 0x7fff7c579fff