Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Faulty rule for not empty #230

Open
macalimlim opened this issue Jul 1, 2019 · 8 comments
Open

Faulty rule for not empty #230

macalimlim opened this issue Jul 1, 2019 · 8 comments

Comments

@macalimlim
Copy link

There is a faulty rule for (not (empty? coll)). it suggests (seq coll)...
Am I right to say that these two expressions should be referential transparent?

@danielcompton
Copy link
Member

danielcompton commented Jul 1, 2019

You're correct that these two expressions will return different things. The theory behind this is that in usage, (seq coll) still returns a truthy value like (not (empty? coll)).

The docstring for empty? says:

Returns true if coll has no items - same as (not (seq coll)). Please use the idiom (seq x) rather than (not (empty? x))

which is where the rule probably came from.

@macalimlim
Copy link
Author

macalimlim commented Jul 2, 2019

I can raise a PR to fix this rule.. this rule only works if the expression is used inside a conditional (e.g. if, when, etc.). but when it is used outside a conditional then it will not be same result..

inside a conditional...
(when (not (empty? coll)) "mike") is same as (when (seq coll) "mike")

outside a conditional...
(let [is-empty (not (empty? coll))] is-empty) is not same as (let [is-empty (seq coll)] is-empty)

@danielcompton
Copy link
Member

I think this would probably need to be a configurable rule, there are also lots of conditionals to check for (including custom ones). I'm probably more inclined to leave it for now, but do you have a real-world example you could show? That might help give me some more context.

@macalimlim
Copy link
Author

I don't currently have a real world example to show, but I think the example I gave above commonly happen in day to day work. I just found it strange that kibit suggested it. Would replacing line 17 of collections.clj with [(when (not (empty? ?x)) . ?y) (when (seq ?x) . ?y)] be enough?

@danielcompton
Copy link
Member

Maybe? I'm a little bit conflicted here TBH.

@macalimlim
Copy link
Author

what do the other maintainers think about my suggested change?

@macalimlim
Copy link
Author

any update on this one?

@danielcompton
Copy link
Member

I'm going to have put this in the hammock to think about. I don't have a lot of time to put into kibit at the moment.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants