Add drafts of condp, if-not, when-not and not= #19

Closed
wants to merge 1 commit into
from

Projects

None yet

3 participants

@yurrriq
Member
yurrriq commented Nov 18, 2015

Per #15, #10, #11 and #12

For better or for worse, this definition of condp allows for various invocations:

(condp {{(lambda ...)}} x
  y z
  q {{module:function | function | (lambda ...)}}
  {{optional default}})

I'm very open to alternate strategies/decisions here, but I wanted to get an initial version written.

It would be great if not= weren't a macro, but this way it can be variadic like its Clojure analog.

@oubiwann
Member

Keep in mind that these tickets aren't for merging code into clj -- we're using the add-clojure-lib branch of the oubiwann/lfe repo. (Didn't want to create a new "lfe" issue tracker in oubiwann/lfe, and this work will essentially deprecate the clj library in favor of using LFE's new built-in Clojure support).

When you submit the PR to that branch, be sure to rename your macros to clj:condp, etc. (to match the function prefixes for the modules).

I'm going to close this PR...

@oubiwann oubiwann closed this Nov 19, 2015
@yurrriq
Member
yurrriq commented Nov 19, 2015

Oops. Will do!

@yurrriq
Member
yurrriq commented Nov 19, 2015

What are your thoughts on "raw" f | m:f vs #'f/a | #'m:f/a? The former is more Clojurian but the latter is more Liffy. I'm pretty on the fence.

@rvirding

Some points:

  • LFE is lisp-2 while clojure is lisp-1. So taking the value of a variable is different from getting the function binding from the name of a function. f and m:f take the value which is the function while #'f/1 and #'m:f/a are need to get the function binding (actually the create a function which calls the named function). It is same as the difference between (let ((f (lambda ...))) ...) and (flet ((f (a b) ...)) ...). What ever we may think of this it is something erlang imposes on us which we can not avoid.
  • When referring to a function you have include the arity as you can have functions with the same name but different arities.
  • My reason for going the "flet way" was to make things more consistent. Why should there only be one local function per name while I can have multiple top functions with the same name?

Again this basic handling of functions and references to functions is what erlang gives us which we can't do anything about.

@yurrriq
Member
yurrriq commented Nov 20, 2015

Right. The way I've written this (there's a small bug atm but I'll fix it before submitting a PR to oubiwann/lfe) allows users to pass in function names "Clojure style," for better or for worse.

I guess my real question is, should we enable such unidiomatic invocation by way of sugar since this is a Clojure-inspired macro, or stick with LFE conventions when porting?

@yurrriq
Member
yurrriq commented Dec 26, 2015

I'm picking this up again and going to favor Erlang Lisper† idioms over Clojurian.

† What's the best word like Clojurian, Erlanger, Lisper, Schemer, etc for LFE?

@oubiwann
Member

I would go for "Lffers" (as in "lifer" e.g., "life-long service" ;-)) or "Liffian" :-D

@yurrriq yurrriq referenced this pull request in oubiwann/lfe Apr 26, 2016
Merged

[WIP] Add clojure lib #2

@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request Apr 27, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
2c5b747
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request May 16, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
759edfb
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request May 28, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
2014cb8
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request Jul 14, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
7d319e7
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request Aug 20, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
1f0654f
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request Aug 30, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
5638643
@yurrriq yurrriq added a commit to yurrriq/lfe that referenced this pull request Aug 30, 2016
@yurrriq yurrriq Update include/clj-conditionals.lfe
Prefer LFE idioms to Clojure, per discussion, i.e. remove the local
fun*/2 and its invocations.

Reindent the fletrec form manually.

Related:
- lfex/clj#19
- rvirding#137
b804526
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment