lisp.lisp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. ;; (setq lisp-indent-function 'common-lisp-indent-function)
  2. ;; (paredit-mode)
  3. ;; ________
  4. ;; /_ __/ /_ ___
  5. ;; / / / __ \/ _ \
  6. ;; / / / / / / __/
  7. ;; /_/ /_/ /_/\___/
  8. ;; __ _________ ____ ________ ____
  9. ;; / / / _/ ___// __ \ / ____/ /_ ____ _/ / /__ ____ ____ ____
  10. ;; / / / / \__ \/ /_/ / / / / __ \/ __ `/ / / _ \/ __ \/ __ `/ _ \
  11. ;; / /____/ / ___/ / ____/ / /___/ / / / /_/ / / / __/ / / / /_/ / __/
  12. ;; /_____/___//____/_/ \____/_/ /_/\__,_/_/_/\___/_/ /_/\__, /\___/
  13. ;; /____/
  14. ;;
  15. ;; The LISP Challenge
  16. ;;
  17. ;; Pick your favorite programming language
  18. ;; Implement the tiniest possible LISP machine that
  19. ;; Bootstraps John Mccarthy'S metacircular evaluator below
  20. ;; Winning is defined by lines of code for scripting languages
  21. ;; Winning is defined by binary footprint for compiled languages
  22. ;;
  23. ;; Listed Projects
  24. ;;
  25. ;; - 512 bytes: https://github.com/jart/sectorlisp
  26. ;; - 13 kilobytes: https://t3x.org/klisp/
  27. ;; - 47 kilobytes: https://github.com/matp/tiny-lisp
  28. ;; - 150 kilobytes: https://github.com/JeffBezanson/femtolisp
  29. ;; - Send pull request to be listed here
  30. ;;
  31. ;; @see LISP From Nothing; Nils M. Holm; Lulu Press, Inc. 2020
  32. ;; @see Recursive Functions of Symbolic Expressions and Their
  33. ;; Computation By Machine, Part I; John McCarthy, Massachusetts
  34. ;; Institute of Technology, Cambridge, Mass. April 1960
  35. ;; NIL ATOM
  36. ;; ABSENCE OF VALUE AND TRUTH
  37. NIL
  38. ;; CONS CELL
  39. ;; BUILDING BLOCK OF DATA STRUCTURES
  40. (CONS NIL NIL)
  41. (CONS (QUOTE X) (QUOTE Y))
  42. ;; REFLECTION
  43. ;; EVERYTHING IS AN ATOM OR NOT AN ATOM
  44. (ATOM NIL)
  45. (ATOM (CONS NIL NIL))
  46. ;; QUOTING
  47. ;; CODE IS DATA AND DATA IS CODE
  48. (QUOTE (CONS NIL NIL))
  49. (CONS (QUOTE CONS) (CONS NIL (CONS NIL NIL)))
  50. ;; LOGIC
  51. ;; BY WAY OF STRING INTERNING
  52. (EQ (QUOTE A) (QUOTE A))
  53. (EQ (QUOTE T) (QUOTE F))
  54. ;; FIND FIRST ATOM IN TREE
  55. ;; CORRECT RESULT OF EXPRESSION IS `A`
  56. ;; RECURSIVE CONDITIONAL FUNCTION BINDING
  57. ((LAMBDA (FF X) (FF X))
  58. (QUOTE (LAMBDA (X)
  59. (COND ((ATOM X) X)
  60. ((QUOTE T) (FF (CAR X))))))
  61. (QUOTE ((A) B C)))
  62. ;; LISP IMPLEMENTED IN LISP
  63. ;; WITHOUT ANY SUBJECTIVE SYNTACTIC SUGAR
  64. ;; RUNS "FIND FIRST ATOM IN TREE" PROGRAM
  65. ;; CORRECT RESULT OF EXPRESSION IS STILL `A`
  66. ;; REQUIRES CONS CAR CDR QUOTE ATOM EQ LAMBDA COND
  67. ;; SIMPLIFIED BUG FIXED VERSION OF JOHN MCCARTHY PAPER
  68. ;; NOTE: ((EQ (CAR E) ()) (QUOTE *UNDEFINED)) CAN HELP
  69. ;; NOTE: ((EQ (CAR E) (QUOTE LAMBDA)) E) IS NICE
  70. ((LAMBDA (ASSOC EVCON PAIRLIS EVLIS APPLY EVAL)
  71. (EVAL (QUOTE ((LAMBDA (FF X) (FF X))
  72. (QUOTE (LAMBDA (X)
  73. (COND ((ATOM X) X)
  74. ((QUOTE T) (FF (CAR X))))))
  75. (QUOTE ((A) B C))))
  76. ()))
  77. (QUOTE (LAMBDA (X Y)
  78. (COND ((EQ Y ()) ())
  79. ((EQ X (CAR (CAR Y)))
  80. (CDR (CAR Y)))
  81. ((QUOTE T)
  82. (ASSOC X (CDR Y))))))
  83. (QUOTE (LAMBDA (C A)
  84. (COND ((EVAL (CAR (CAR C)) A)
  85. (EVAL (CAR (CDR (CAR C))) A))
  86. ((QUOTE T) (EVCON (CDR C) A)))))
  87. (QUOTE (LAMBDA (X Y A)
  88. (COND ((EQ X ()) A)
  89. ((QUOTE T) (CONS (CONS (CAR X) (CAR Y))
  90. (PAIRLIS (CDR X) (CDR Y) A))))))
  91. (QUOTE (LAMBDA (M A)
  92. (COND ((EQ M ()) ())
  93. ((QUOTE T) (CONS (EVAL (CAR M) A)
  94. (EVLIS (CDR M) A))))))
  95. (QUOTE (LAMBDA (FN X A)
  96. (COND
  97. ((ATOM FN)
  98. (COND ((EQ FN (QUOTE CAR)) (CAR (CAR X)))
  99. ((EQ FN (QUOTE CDR)) (CDR (CAR X)))
  100. ((EQ FN (QUOTE ATOM)) (ATOM (CAR X)))
  101. ((EQ FN (QUOTE CONS)) (CONS (CAR X) (CAR (CDR X))))
  102. ((EQ FN (QUOTE EQ)) (EQ (CAR X) (CAR (CDR X))))
  103. ((QUOTE T) (APPLY (EVAL FN A) X A))))
  104. ((EQ (CAR FN) (QUOTE LAMBDA))
  105. (EVAL (CAR (CDR (CDR FN)))
  106. (PAIRLIS (CAR (CDR FN)) X A))))))
  107. (QUOTE (LAMBDA (E A)
  108. (COND
  109. ((ATOM E) (ASSOC E A))
  110. ((ATOM (CAR E))
  111. (COND ((EQ (CAR E) (QUOTE QUOTE)) (CAR (CDR E)))
  112. ((EQ (CAR E) (QUOTE COND)) (EVCON (CDR E) A))
  113. ((QUOTE T) (APPLY (CAR E) (EVLIS (CDR E) A) A))))
  114. ((QUOTE T) (APPLY (CAR E) (EVLIS (CDR E) A) A))))))