ascension.scm 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. ;; Copyright (C) 2017 Jeremiah Orians
  2. ;; This file is part of stage0.
  3. ;;
  4. ;; stage0 is free software: you can redistribute it and/or modify
  5. ;; it under the terms of the GNU General Public License as published by
  6. ;; the Free Software Foundation, either version 3 of the License, or
  7. ;; (at your option) any later version.
  8. ;;
  9. ;; stage0 is distributed in the hope that it will be useful,
  10. ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. ;; GNU General Public License for more details.
  13. ;;
  14. ;; You should have received a copy of the GNU General Public License
  15. ;; along with stage0. If not, see <http://www.gnu.org/licenses/>.
  16. ;; 2 level car/cdr
  17. (define caar (lambda (x) (car (car x))))
  18. (define cadr (lambda (x) (car (cdr x))))
  19. (define cdar (lambda (x) (cdr (car x))))
  20. (define cddr (lambda (x) (cdr (cdr x))))
  21. ; 3 level car/cdr
  22. (define caaar (lambda (x) (car (car (car x)))))
  23. (define caadr (lambda (x) (car (car (cdr x)))))
  24. (define cadar (lambda (x) (car (cdr (car x)))))
  25. (define caddr (lambda (x) (car (cdr (cdr x)))))
  26. (define cdaar (lambda (x) (cdr (car (car x)))))
  27. (define cdadr (lambda (x) (cdr (car (cdr x)))))
  28. (define cddar (lambda (x) (cdr (cdr (car x)))))
  29. (define cdddr (lambda (x) (cdr (cdr (cdr x)))))
  30. ; 4 level car/cdr
  31. (define caaaar (lambda (x) (car (car (car (car x))))))
  32. (define caaadr (lambda (x) (car (car (car (cdr x))))))
  33. (define caadar (lambda (x) (car (car (cdr (car x))))))
  34. (define caaddr (lambda (x) (car (car (cdr (cdr x))))))
  35. (define cadaar (lambda (x) (car (cdr (car (car x))))))
  36. (define cadadr (lambda (x) (car (cdr (car (cdr x))))))
  37. (define caddar (lambda (x) (car (cdr (cdr (car x))))))
  38. (define cadddr (lambda (x) (car (cdr (cdr (cdr x))))))
  39. (define cdaaar (lambda (x) (cdr (car (car (car x))))))
  40. (define cdaadr (lambda (x) (cdr (car (car (cdr x))))))
  41. (define cdadar (lambda (x) (cdr (car (cdr (car x))))))
  42. (define cdaddr (lambda (x) (cdr (car (cdr (cdr x))))))
  43. (define cddaar (lambda (x) (cdr (cdr (car (car x))))))
  44. (define cddadr (lambda (x) (cdr (cdr (car (cdr x))))))
  45. (define cdddar (lambda (x) (cdr (cdr (cdr (car x))))))
  46. (define cddddr (lambda (x) (cdr (cdr (cdr (cdr x))))))
  47. ; Append
  48. (define append
  49. (lambda (x y)
  50. (cond
  51. ((null? x) y)
  52. (#t (cons (car x) (append (cdr x) y))))))
  53. (define string-append (lambda (x y) (list->string (append (string->list x) (string->list y)))))
  54. ; Assoc
  55. (define assoc
  56. (lambda (x y)
  57. (cond
  58. ((string=? (caar y) x) (car y))
  59. (#t (assoc x (cdr y))))))
  60. ; Get-index
  61. (define get-index
  62. (lambda (number list)
  63. (if (null? list)
  64. nil
  65. (if (= 0 number)
  66. (car list)
  67. (get-index (- number 1) (cdr list))))))
  68. ; Reverse
  69. (define reverse
  70. (lambda (l)
  71. (begin
  72. (define reving
  73. (lambda (list result)
  74. (cond
  75. ((null? list) result)
  76. ((list? list) (reving (cdr list) (cons (car list) result)))
  77. (#t (cons list result)))))
  78. (reving l nil))))
  79. ; Map
  80. (define map
  81. (lambda (f l)
  82. (if (null? l)
  83. nil
  84. (cons (f (car l)) (map f (cdr l))))))
  85. ; Filter
  86. (define filter
  87. (lambda (p l)
  88. (if (null? l)
  89. nil
  90. (if (p (car l))
  91. (cons (car l) (filter p (cdr l)))
  92. (filter p (cdr l))))))
  93. ; Folds
  94. (define fold-right
  95. (lambda (f a l)
  96. (if (null? l)
  97. a
  98. (f (car l) (fold-right f a (cdr l))))))
  99. (define fold-left
  100. (lambda (f a xs)
  101. (if (null? xs)
  102. a
  103. (fold-left f (f a (car xs)) (cdr xs)))))
  104. ; char functions
  105. (define numeric-char? (lambda (ch) (if (and (char? ch) (<= 48 ch 57)) #t nil)))
  106. (define digit->number (lambda (d) (if (and (char? d) (<= 48 d 57)) (- d 48) nil)))
  107. ; length functions
  108. (define length (lambda (l) (if (null? l) 0 (+ 1 (length (cdr l))))))
  109. (define string-length (lambda (s) (length (string->list s))))
  110. ; More generic comparision
  111. (define eq?
  112. (lambda (a b)
  113. (cond
  114. ((string? a) (if (string? b) (string=? a b) nil))
  115. ((char? a) (if (char? b) (= a b) nil))
  116. (#t (= a b)))))
  117. "ascension has successfully loaded"