application/octet-stream
•
2.04 KB
•
48 lines
; Nujel - Copyright (C) 2020-2021 - Benjamin Vincent Schulenburg
; This project uses the MIT license, a copy should be included under /LICENSE
;; A bunch of procedurs working on procedures, using type specialized λs
[defun ref [l i]
"Return whatver is at position I in L"
[case [type-of l]
[[:nil] #nil]
[[:tree] [tree/ref l i]]
[[:string] [char-at l i]]
[[:array] [array/ref l i]]
[[:pair] [list/ref l i]]
[otherwise [throw [list :invalid-type "You can only use ref with a collection" l [current-lambda]]]]]]
[defun filter [l p]
"Runs predicate p over every item in collection l and returns a list consiting solely of items where p is true"
[case [type-of l]
[[:nil] #nil]
[[:pair] [list/filter l p]]
[[:array] [array/filter l p]]
[otherwise [throw [list :invalid-type "You can only use filter with a collection" l [current-lambda]]]]]]
[defun reduce [f l α]
"Combine all elements in collection l using operation F and starting value α"
[case [type-of l]
[[:nil] α]
[[:pair] [list/reduce f l α]]
[[:array] [array/reduce f l α]]
[otherwise [f α l]]]]
[defun length [α]
"Returns the length of collection α"
[case [type-of α]
[[:nil] 0]
[[:array] [array/length α]]
[[:pair] [list/length α]]
[[:string] [string/length α]]
[[:tree] [tree/size α]]
[otherwise [throw [list :invalid-type "You can only use length with a collection" α [current-lambda]]]]]]
[defun map [f l]
"Runs f over every item in collection l and returns the resulting list"
[case [type-of l]
[[:nil] #nil]
[[:pair] [list/map f l]]
[[:array] [array/map f l]]
[otherwise [throw [list :invalid-type "You can only use map with a collection" l [current-lambda]]]]]]