94 Commits

Author SHA1 Message Date
Aryadev Chavali
334ece1ee7 Split source code into different modules for cleanliness 2025-02-14 21:46:43 +00:00
Aryadev Chavali
f127e1e955 Update gitignore, add requirements to README, rework bob and build 2025-02-14 21:46:43 +00:00
Aryadev Chavali
f0e7c9f3f0 WIP: Making a simple re-deal program.
Gives a hand from a shuffled deck to the user, asks them to provide
indices for cards they wish to re-deal then does so.
2025-02-14 20:53:44 +00:00
Aryadev Chavali
d328bfbbdf Adjust Bob so we can use quickload the project to get all dependencies 2025-02-14 20:39:00 +00:00
Aryadev Chavali
fba391a6e8 Refactor Joker generation in make-deck to use mapcar on a range.
This new version is terser while still expressing what I want.
2025-02-14 17:44:46 +00:00
Aryadev Chavali
955e921f80 Leave FORMS as is in $ operator.
`$` takes a list of forms and makes a unary function which applies
them via `->>`.  Previous definition reversed the forms supplied
s.t. `$` was closer to the applicative operator in Haskell i.e. the
function (<$> f g) is f(g(x)).  But this version fits closer with the
lower operator (->>) being used AND allows easier lifting from
`->>` (which produces a value) to `$` (which produces a function).
2025-02-14 17:42:11 +00:00
Aryadev Chavali
2c8b5e7110 Deck and joker constructor
Joker constructor takes a rank for uniqueness - rank doesn't really
change anything in terms of the "power" of a joker but helps with
ensuring jokers are unique in a deck.

Deck constructor takes an optional argument for the number of decks.
A deck includes two jokers, so n decks include 2n jokers.
2025-02-14 17:35:01 +00:00
Aryadev Chavali
c10b590420 Fixed bug in int->rank where n >= 13 leads to error
Because I assume n is modded already.
2025-02-14 17:34:31 +00:00
Aryadev Chavali
e5a53957b3 Some serialisers to make pretty outputs
I can now use this package for a console application since we can
pretty print cards.
2025-02-14 17:24:35 +00:00
Aryadev Chavali
9ab585d7af Implement comparator functions for ranks, suits and cards. 2025-02-14 17:17:58 +00:00
Aryadev Chavali
3906be4d59 Adjust rank->int and int->rank for ACE supremacy
Generally, ACE is the best card in Cantedraw in a card-by-card basis
thus it should be the higher when comparing.
2025-02-14 17:17:43 +00:00
Aryadev Chavali
76a7017246 Implement some simple converters for custom types to/from integers
Given n in 0..51, certainly there exists r, s s.t.  `n = 13s + r`
where r in 0..12 and s in 0..3.  `r` is the rank, and `s` is the suit.

ranks are ordered Ace, 2, 3, ..., Queen, King and suits are ordered
Diamond, Club, Heart, Spade.

Therefore there is a 1-1 correspondence between 0..51 and any card in
the deck.

Jokers are a bit less straightforward; for now I'll define them as an
outlier which doesn't exist in the same bounds (which is why they're
the default return for suit in int->suit).  Likely I'll go for -1
representing a Joker.
2025-02-14 17:17:43 +00:00
Aryadev Chavali
f4b43031ad Add a package for modelling cards
Time to do the fun non-yakshaving part.  I'll start out by writing
some custom types for the objects of concern: ranks, suits, cards and
sets of cards.
2025-02-14 17:17:43 +00:00
Aryadev Chavali
f8a834c0d2 Rewrote --> to take a placeholder symbol as first argument
Instead of exporting cantedraw.lib.macro._ and making anyone who wants
to use the --> macro _require_ importing that specific symbol, let's
just make it so the user has to supply a placeholder name before they
do anything.  This means each package provides its own placeholder
symbol which lowers coupling.
2025-02-14 16:34:15 +00:00
Aryadev Chavali
02ff1a3fb3 Prefix all packages with cantedraw
This is mostly a sanity check in-case anyone else decides to load this
system for use in their own package - don't want to conflict with
their names.
2025-02-14 16:11:54 +00:00
Aryadev Chavali
4c27e7d5c1 cantedraw.lisp -> main.lisp 2025-02-14 16:00:41 +00:00
Aryadev Chavali
b335a12b78 Added a README 2025-02-14 15:10:43 +00:00
Aryadev Chavali
8bd7900946 Use := instead of = so we're not re-interning a symbol in cl-loop 2025-02-14 15:10:43 +00:00
Aryadev Chavali
a1a9ae008a Remove dependency on deploy - use ASDF's program-op instead 2025-02-14 15:10:39 +00:00
Aryadev Chavali
90ef834393 odraw -> cantedraw
Why name it something unique when this is what I'm going to be making
at the end of it all?  Just makes it more confusing for the end user.
2025-02-11 00:54:01 +00:00
Aryadev Chavali
9b3d8e471a Some dir-locals for your (my) convenience. 2025-02-11 00:42:49 +00:00
Aryadev Chavali
802c47bb9f Added build script for terminal use 2025-02-11 00:41:22 +00:00
Aryadev Chavali
bd3a17d678 Move parse-integer* 2025-02-11 00:41:00 +00:00
Aryadev Chavali
52f7db44cf main -> odraw 2025-02-11 00:41:00 +00:00
Aryadev Chavali
0b66ce5dc1 Slightly clean up the example program in main 2025-02-11 00:40:19 +00:00
Aryadev Chavali
82875e22d3 Import lib.functions in main 2025-02-11 00:40:19 +00:00
Aryadev Chavali
ae5cc7141d Rework rev-map to use ->> and to make LIST cdrs rather than CONS 2025-02-11 00:40:19 +00:00
Aryadev Chavali
de653b67fb Rework $ operator to work like applicative in Haskell
f $ g $ h -> f(g(h)) whereas previous implementation ($ f g h) was
h(g(f)).
2025-02-11 00:40:19 +00:00
Aryadev Chavali
cb7dacccfa rev-map function
Given an indicator function (A->B) and a list of items of A, return
an association list associating B to the elements that map to it;
essentially the inverse map of the indicator.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
3e6da6b0f4 Macro (alist-val) to access the actual value of a key in an alist 2025-02-11 00:40:19 +00:00
Aryadev Chavali
5c6d444c2e Reworked build.lisp and load.lisp into bob.lisp
bob.lisp quickloads the dependencies necessary and defines functions
which I can just call from my REPL to load or build the project.
Better than loading the file over and over again.  Affectionately
named after "Bob The Builder".
2025-02-11 00:40:19 +00:00
Aryadev Chavali
279437cb81 Implement split function.
Given a list and index into that list, return a cons where the car is
all elements up to that index (exclusive) and the cdr is the rest of
the list.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
2d49ed25ac Implement a "take" function to read subsequences of a list
Basically a wrapper over subseq but for when using `->>` as the list
is the last parameter.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
b29855047b Implement $ operator, second class version of the applicative operator
The `$` operator takes a sequence of FORMS and returns a unary
function which applies the input through that sequence via the `->>`
operator.

For example, consider the predicate "not null".  `null` is built into
Common Lisp but "not null" requires writing a
function (lambda (x) (not (null x))).  Now, using this operator, you
can write ($ not null) which returns the same lambda as above while
being more concise.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
c5d9888641 functions -> forms in lib.macros 2025-02-11 00:40:19 +00:00
Aryadev Chavali
ef572b992b Introduce lib.functions which includes helper functions
Splitting macros and functions into different packages and source code
makes it easier to look at.   Functions currently implemented:
- range: like Python's range
- parse-integer*: parse-integer but junk-allowed is set to t.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
5a48b66dd6 Extract parsing logic from read-integers into parse-integers 2025-02-11 00:40:19 +00:00
Aryadev Chavali
6b60c5065b Re-implement all functions in main via fn macro. 2025-02-11 00:40:19 +00:00
Aryadev Chavali
bbde84c7d7 Add type alias for function and macro for defining functions with type specifier
`fn' is a convenience macro for defining functions with a type
specifier.  Only really matters for `sbcl` and other hard-optimising
Lisp interpreters which actually take these seriously.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
bd47029bd8 Implement a program that reads some integers then prints their sum
Allows junk, and doesn't crash horribly.
2025-02-11 00:40:19 +00:00
Aryadev Chavali
4977b427d8 Implement a `while' macro. 2025-02-11 00:40:19 +00:00
Aryadev Chavali
e5253472a0 Rewrite entrypoint to prompt for a name, then print it 2025-02-11 00:40:19 +00:00
Aryadev Chavali
c069917170 Implement threading macros and make package lib.macros to hold them. 2025-02-11 00:40:19 +00:00
Aryadev Chavali
19b68fa49c Initial commit.
Setup boilerplate for system/package management.  In particular, setup
an entry-point and Shinmera's "deploy" to build executables.

Also write some scripts to easily load or build the project without
Emacs - just `sbcl --load <x>.lisp`.
2025-02-11 00:40:19 +00:00