Folks, do yourself a favor, and check out the bot's source: https://github.com/krajj7/BotHack/blob/master/src/bothack/bo... It's really, really neat. Even to those of us who know little or nothing about the game, from the nested Englishy descriptors piled up into short conditions for things-the-bot-might-want-to-do, the basic strategies can be discerned...
I have no idea how to even parse this: (or (if (and (weak? player) If it is a player or a weak player? Or this probably simple function(?): (defn- want-protection? [game] (and ( 15 (:xplvl (:player game))))) It makes zero intuitive sense to me.
The first one is missing a whole bunch of context. But here's a start: The first thing inside parentheses is the operator/function, the rest are arguments/operands. This one is best viewed from the inside out, so... a method ending in a question mark is most likely a predicate, i.e. a true/false test returning a boolean. So we're testing for a weak player. Outside from there is an 'and', so we're looking to combine that test with another one (further to the right, that you didn't show). Maybe checking if the player is both weak and hungry, as that may mean he'll croak soon.
Every paren pair ('S-expression') in Lisp (err, Clojure) returns a value, so the "if" is not so much a control-flow construct as it's like C's ternary op: [ cond ? iftrue : iffalse ]. Its first argument will be a test, like that weak-hunger thing. Then you will have one or maybe two other arguments. The first is returned if the condition is true, the second one if false. There may not be a second argument, in which case the return value will be 'nil' or maybe 'false' - they're sorta equivalent anyway.
Finally, the "or" will evaluate and return its first subexpression if it's true, or also evaluate the second one if not and return that. You can actually have as many arguments to an "or" as you like - they will be short-circuit-evaluated until one of the arguments is true, or if you hit the right paren without finding a true, you'll get a 'false' ('nil' ?).
------------------------------------
The second example is a function definition. By convention, 'want-protection?' will be the name of a predicate, i.e. something that tests and returns true/false.
'game' is the single argument to that function. From usage later on, it looks to be a map, or you might think of it as an associative array, or a key-value mapping.
The first half tests whether the 'protection' value of the player, which itself is the 'player' value of the game (in C: game.player.protection, except those components are keys rather than fields) is less than (see the '<' operator on the left?) 3. The second half tests whether (I'm guessing) his experience level is greater than 15. The 'and' combines those, i.e. if he's at least a lvl 16 player and his prot value sucks at less than 3, he'll want protection (so return 'true').