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 (lookup expr env) 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 'if)
  34. (if (evaluate (car arguments) env)
  35. (evaluate (cadr arguments) env)
  36. (evaluate (caddr arguments) env))) ; if
  37. ((eql function 'defun)
  38. (let ((name (car arguments))
  39. (params (cadr arguments))
  40. (body (caddr arguments)))
  41. (setf global-environment (acons name `(lambda ,params ,body) global-environment))
  42. name))
  43. ((eql function 'setq)
  44. (let ((symbol (car arguments))
  45. (value (evaluate (cadr arguments) env)))
  46. (setf global-environment (acons symbol value global-environment))
  47. value))
  48. (t ; Пользовательская функция или lambda (ищем в окружении)
  49. (let ((func-def (lookup function env)))
  50. (if func-def
  51. (let ((func (cdr func-def))
  52. (params (cadr func))
  53. (body (caddr func))
  54. (evaluated-args (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  55. (evaluate body (append (mapcar #'cons params evaluated-args) env)))
  56. (let ((func-def-global (lookup function global-environment)))
  57. (if func-def-global
  58. (let ((func (cdr func-def-global))
  59. (params (cadr func))
  60. (body (caddr func))
  61. (evaluated-args (mapcar #'(lambda (arg) (evaluate arg env)) arguments)))
  62. (evaluate body (append (mapcar #'cons params evaluated-args) env)))
  63. (error "Неизвестная функция: ~A" function))))))
  64. )))
  65.  
  66. (evaluate expression global-environment))))
  67.  
  68. ;; Примеры использования
  69. (format t "Результат: ~A~%" (lisp-interpreter '(cons (car (cdr (quote (e r t w)))) (cons (cdr (quote (g h 6))) (quote ())))))
  70. (format t "Результат: ~A~%" (lisp-interpreter '(+ 2 (* 3 4))))
  71. (format t "Результат: ~A~%" (lisp-interpreter '(- 10 (/ 6 2))))
  72. (format t "Результат: ~A~%" (lisp-interpreter '(if (> 5 3) 10 20)))
  73. (format t "Результат: ~A~%" (lisp-interpreter '(if (= 5 3) 10 20)))
  74. (format t "Результат: ~A~%" (lisp-interpreter '(car (list 1 2 3))))
  75.  
Success #stdin #stdout #stderr 0.02s 9724KB
stdin
Standard input is empty
stdout
Результат: (R (H 6))
Результат: 14
Результат: 7
Результат: 10
Результат: 20
Результат: 1
stderr
Warning: reserving address range 0x80000c0000...0x1fffffffffff that contains memory mappings. clisp might crash later!
Memory dump:
  0x8000000000 - 0x80000bffff
  0x147315600000 - 0x1473158e4fff
  0x147315a00000 - 0x147315a02fff
  0x147315a03000 - 0x147315c01fff
  0x147315c02000 - 0x147315c02fff
  0x147315c03000 - 0x147315c03fff
  0x147315c15000 - 0x147315c39fff
  0x147315c3a000 - 0x147315dacfff
  0x147315dad000 - 0x147315df5fff
  0x147315df6000 - 0x147315df8fff
  0x147315df9000 - 0x147315dfbfff
  0x147315dfc000 - 0x147315dfffff
  0x147315e00000 - 0x147315e03fff
  0x147315e04000 - 0x147316003fff
  0x147316004000 - 0x147316004fff
  0x147316005000 - 0x147316005fff
  0x147316060000 - 0x147316061fff
  0x147316062000 - 0x147316071fff
  0x147316072000 - 0x1473160a5fff
  0x1473160a6000 - 0x1473161dcfff
  0x1473161dd000 - 0x1473161ddfff
  0x1473161de000 - 0x1473161e0fff
  0x1473161e1000 - 0x1473161e1fff
  0x1473161e2000 - 0x1473161e3fff
  0x1473161e4000 - 0x1473161e4fff
  0x1473161e5000 - 0x1473161e6fff
  0x1473161e7000 - 0x1473161e7fff
  0x1473161e8000 - 0x1473161e8fff
  0x1473161e9000 - 0x1473161e9fff
  0x1473161ea000 - 0x1473161f7fff
  0x1473161f8000 - 0x147316205fff
  0x147316206000 - 0x147316212fff
  0x147316213000 - 0x147316216fff
  0x147316217000 - 0x147316217fff
  0x147316218000 - 0x147316218fff
  0x147316219000 - 0x14731621efff
  0x14731621f000 - 0x147316220fff
  0x147316221000 - 0x147316221fff
  0x147316222000 - 0x147316222fff
  0x147316223000 - 0x147316223fff
  0x147316224000 - 0x147316251fff
  0x147316252000 - 0x147316260fff
  0x147316261000 - 0x147316306fff
  0x147316307000 - 0x14731639dfff
  0x14731639e000 - 0x14731639efff
  0x14731639f000 - 0x14731639ffff
  0x1473163a0000 - 0x1473163b3fff
  0x1473163b4000 - 0x1473163dbfff
  0x1473163dc000 - 0x1473163e5fff
  0x1473163e6000 - 0x1473163e7fff
  0x1473163e8000 - 0x1473163edfff
  0x1473163ee000 - 0x1473163f0fff
  0x1473163f3000 - 0x1473163f3fff
  0x1473163f4000 - 0x1473163f4fff
  0x1473163f5000 - 0x1473163f5fff
  0x1473163f6000 - 0x1473163f6fff
  0x1473163f7000 - 0x1473163f7fff
  0x1473163f8000 - 0x1473163fefff
  0x1473163ff000 - 0x147316401fff
  0x147316402000 - 0x147316402fff
  0x147316403000 - 0x147316423fff
  0x147316424000 - 0x14731642bfff
  0x14731642c000 - 0x14731642cfff
  0x14731642d000 - 0x14731642dfff
  0x14731642e000 - 0x14731642efff
  0x5648146d3000 - 0x5648147c3fff
  0x5648147c4000 - 0x5648148cdfff
  0x5648148ce000 - 0x56481492dfff
  0x56481492f000 - 0x56481495dfff
  0x56481495e000 - 0x56481498efff
  0x56481498f000 - 0x564814992fff
  0x564814de8000 - 0x564814e08fff
  0x7fffb2896000 - 0x7fffb28b6fff
  0x7fffb2990000 - 0x7fffb2993fff
  0x7fffb2994000 - 0x7fffb2995fff