Discuss Scratch
- Discussion Forums
- » Suggestions
- » A new operators block, similar to (letter () of [])
- ETS12345
-
25 posts
A new operators block, similar to (letter () of [])
Support, I dont want to have to remake the block that you used:<<(join (letter (1) of (\[scratchblocks\] command)) (join (letter (2) of (\[scratchblocks\] command)) (join (letter (3) of (\[scratchblocks\] command)) (join (letter (4) of (\[scratchblocks\] command)) (letter (5) of (\[scratchblocks\] command)))))) = [Ask []> and <[\] and wait] = (join (letter (length of (\[scratchblocks\] command)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (1)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (2)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (3)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (4)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (5)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (6)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (7)) of (\[scratchblocks\] command)) (join (letter ((length of (\[scratchblocks\] command)) - (8)) of (\[scratchblocks\] command)) (letter ((length of (\[scratchblocks\] command)) - (9)) of (\[scratchblocks\] command)))))))))))>>every time I want to do its action
Yes!!!
forever
Support ::pen
end
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
First of all, even if custom reporters are added, they'll have to use one of the following: So, for anybody who's curious, here is the full workaround, that is the absolute best approximation to the block suggested in the OP, which stores its output in ‘result’:{several long and therefore probably laggy workarounds}And if we had custom reporters, this block would need no variables at all.
To compare, the speed of all three blocks is pretty good for small strings, and the second one should work for almost anything that you would actually need to do in Scratch. It's likely that whatever block the Scratch Team implemented would also be slow on ridiculously large strings, simply because creating substrings, unless they are interned, is by nature an O(n) operation.
My point with this post is that OP's argument that the workaround is laggy / slow is basically moot; although this custom block only works in a single thread, if you are doing multi-threaded string manipulation you are already probably doing something wrong.
I'm honestly not sure where I stand in terms of better string manipulation features in Scratch - certainly they are useful, but figuring out how to implement them myself was honestly one of the best critical thinking exercises I ever received from Scratch. It's important to be able to know how these sorts of operations work on the inside, as it allows you to see how slow they really are - I think people learning to implement them manually is a good experience, and I think that it is not at all bad that Scratch provides it.
I especially think that if we do ever get custom reporters, we should not implement blocks like these - if there were custom reporters (and maybe local variables) than implementing these blocks by hand would have very little negative effect, while it would have a huge educational effect.
Maybe not though. I am using anecdotal evidence here, but I don't think my point is entirely invalid.
- what I used
- repeat blocks and variables
- being recursive functions
- no less laggy than what I'm using (because they're the same)
- First of all, it creates this completely unnecessary variable that just clutters up the data section. Also, if two of these scripts are running at the same time, and they use the same variable, that would really mess things up. Also, repeat blocks pause between each repetition, so that would make it take longer.
- Calling custom blocks generates lag.
move () stepsor just not make them usable to each user until that user has submitted a correct workaround. And if you think that that's kind or harsh, I think that I'm being easy, as one could get rid of all variables, get rid of all of these:
if on edge, bounce
change x by ()
set x to ()
change y by ()
set y to ()
turn cw () degrees
turn ccw () degrees
go to [ v]
say [] for (2) secs
think [] for (2) secs
next costume
next backdrop
change size by ()//or alternately, set size to () %
play sound [ v]
rest for () beats
change volume by ()//or alternately, set volume to () %
change tempo by ()//or alternately, set tempo to () bpm
if <> then
end
wait until <>
repeat until <>
end
(distance to [ v])
(foo)
(☁ score)
change [ v] by (0)//or alternately, set [ v] to []
add [] to [list v]
<[ v] contains [thing] ?>
(() + (0))
(() * (0))
<[] < []>// or alternately, get rid of <[] > []>
<[] = []>
<<> and <>>//or alternately, get rid of <<> or <>>
(round ())
([floor v] of (9))//or alternately, get rid of ([ceiling v] of (9))
([10 ^ v] of (9))//or alternately, get rid of ([e ^ v] of (9))
([log v] of (9))//or alternately, get rid of ([ln v] of (9))
([abs v] of (9)), get rid of all but one of these:
forever
end
go to x: () y: (0)
point towards [ v]
(x position)
(y position)
(direction)
<<> and <>>
<<> or <>>
<not <>>
(() / (0))//or alternately, (() - (0))
(length of [ v] :: list)//or alternately, replace item ( v) of [list v] with [thing]
change [ v] effect by (25)//or alternately, set [ v] effect to (0)
change pen color by ()//or alternately, set pen color to ()
change pen shade by ()//or alternately, set pen shade to ()
change pen size by ()//or alternately, set pen size to ()
when green flag clicked
repeat ()
end
wait () secs
stop [all v]
stop [this script v]
(timer)
reset timer
(days since 2000)
(() mod (0))//or alternately, getting rid of ([floor v] of (9)) AND ([ceiling v] of (9))
([sin v] of (9))//or alternately, ([cos v] of (9))
([tan v] of (9))
([asin v] of (9))//or alternately, ([acos v] of (9))
([sqrt v] of (9))
broadcast [ v] and wait
switch backdrop to [ v] and wait
(volume)
(tempo)
<[] < []>, and get rid of the stage (or do that until a correct workaround can be provided). While all of these blocks can be workedaround with what's left, would you really want Scratch to be like that. More importantly, the Scratch Team obviously didn't want it to be like that because the Scratch Team didn't make it like that. The reason for that would be that even just getting rid of the first set of blocks that I gave would raise Scratch's low floor too high to be accessible for anyone who is neither a math prodigy nor has the help of one, so it would exclude them, and that conflicts with Scratch's purpose, which is to introduce beginners to coding, and chances are, any math prodigy would already know how to code.
<[] = []>
<[] > []>
So yes, maybe there should be an option to enter “challenge mode” on Scratch, where this block and several others are removed, so the user must figure out how to create workarounds for them, but I think that this block should be added to make the low floor even lower.
- TheMonsterOfTheDeep
-
1000+ posts
A new operators block, similar to (letter () of [])
Uh, no, these are not laggy. Length of script does not correlate with lag in any real way. Don't believe me? I have all the workarounds in this project, please go try them for yourself.several long and therefore probably laggy workarounds
First of all, even if custom reporters are added, they'll have to use one of the following:I already take issue with this because your workaround could not possibly be used in a custom reporter very effectively, as it can only use a preset number of characters.
- what I used: no less laggy than what I'm using (because they're the same)
repeat blocks and variables: First of all, it creates this completely unnecessary variable that just clutters up the data section. Also, if two of these scripts are running at the same time, and they use the same variable, that would really mess things up. Also, repeat blocks pause between each repetition, so that would make it take longer.Let's see:
- Unnecessary variable: I also dislike using a variable, but it's not really a huge issue. Also, if we had local variables, this problem would not exist.
- Using two blocks at the same time: let me refer you to my original post
- Repeat block pauses: not with run without screen refresh it doesn't. if you are doing multi-threaded string manipulation you are already probably doing something wrong.
Okay, but it's not enough lag to be noticeable unless you are manipulating very big strings. However, if you are doing string manipulation, it's likely that you aren't going to be manipulating strings over 10240 characters, as that is the join block limit.
- being recursive functions: Calling custom blocks generates lag.
Also, by your “forcing Scratchers to think to get blocks” logic, we could either get rid of all of these blocks:I see that the point I made in my first post wasn't entirely clear.
Basically, string manipulation is a data manipulation topic. Programming outside of Scratch is all about data manipulation - and that is why I believe that Scratch's limited subset of string operators in particular provides a good educational opportunity. Most of what you have to do in Scratch will not be particularly applicable in other languages, but the data manipulation you do very well could be. Certainly most other languages have built-in functions for a lot of this stuff, but sometimes you do have to build data structures from the ground up, and that is when this stuff is really important to know.
My point is not that building everything from scratch is educational. Rather, building certain things from scratch - certain things that will be applicable elsewhere - is. Scratch is, after all, primarily a graphical language, which is why it provides so many graphical utilities. It is not the correct language to do advanced data manipulation; rather it is merely meant to be an introduction to programming. I think that teaching users string manipulation the hard way is the perfect sort of segway into more advanced languages.
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
Like @TheMonsterOfTheDeep said, workaroundable, and doesn't lag at all. No support.
Last edited by duckboycool (Jan. 23, 2017 02:18:21)
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
They're not laggy if used once, but my project will be heavily reliant on them.Uh, no, these are not laggy. Length of script does not correlate with lag in any real way. Don't believe me? I have all the workarounds in this project, please go try them for yourself.several long and therefore probably laggy workarounds
That's the workaround that lags the least to run.First of all, even if custom reporters are added, they'll have to use one of the following:I already take issue with this because your workaround could not possibly be used in a custom reporter very effectively, as it can only use a preset number of characters.
- what I used: no less laggy than what I'm using (because they're the same)
I do not know that Scratch 3.0 will not include a “launch” block (like Snap!'s).repeat blocks and variables: First of all, it creates this completely unnecessary variable that just clutters up the data section. Also, if two of these scripts are running at the same time, and they use the same variable, that would really mess things up. Also, repeat blocks pause between each repetition, so that would make it take longer.Let's see:
- Unnecessary variable: I also dislike using a variable, but it's not really a huge issue. Also, if we had local variables, this problem would not exist.
- Using two blocks at the same time: let me refer you to my original postif you are doing multi-threaded string manipulation you are already probably doing something wrong.
I can't do run without screen refresh in my project because scripts don't automatically run without screen refresh in Scratch. - Repeat block pauses: not with run without screen refresh it doesn't.
or using it a lot, which my project will do.Okay, but it's not enough lag to be noticeable unless you are manipulating very big strings.
- being recursive functions: Calling custom blocks generates lag.
I have no idea what users of the finished project will input.[quote=TheMonsterOfTheDeep} However, if you are doing string manipulation, it's likely that you aren't going to be manipulating strings over 10240 characters, as that is the join block limit.
Also, by your “forcing Scratchers to think to get blocks” logic, we could either get rid of all of these blocks:I see that the point I made in my first post wasn't entirely clear.
Basically, string manipulation is a data manipulation topic. Programming outside of Scratch is all about data manipulation - and that is why I believe that Scratch's limited subset of string operators in particular provides a good educational opportunity. Most of what you have to do in Scratch will not be particularly applicable in other languages, but the data manipulation you do very well could be. Certainly most other languages have built-in functions for a lot of this stuff, but sometimes you do have to build data structures from the ground up, and that is when this stuff is really important to know.
My point is not that building everything from scratch is educational. Rather, building certain things from scratch - certain things that will be applicable elsewhere - is. Scratch is, after all, primarily a graphical language, which is why it provides so many graphical utilities. It is not the correct language to do advanced data manipulation; rather it is merely meant to be an introduction to programming. I think that teaching users string manipulation the hard way is the perfect sort of segway into more advanced languages.
How is what I'm suggesting advanced? To me, advanced is like https://scratch-mit-edu.ezproxyberklee.flo.org/discuss/topic/235390/
Compared to that, what I'm suggesting is child's play.
Last edited by dvargasews (Jan. 23, 2017 04:07:24)
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
It lags; just too little to notice if used ONCE. Like @TheMonsterOfTheDeep said, workaroundable, and doesn't lag at all. No support.
60 second rule, I SHALL PREVAIL AGAINST YOU!
Edit: I prevailed.
Last edited by dvargasews (Jan. 23, 2017 02:29:20)
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
Is there a huge point of making a block that likely won't even lag less than a workaround when said workaround barely lags?It lags; just too little to notice if used ONCE. Like @TheMonsterOfTheDeep said, workaroundable, and doesn't lag at all. No support.
Last edited by duckboycool (Jan. 23, 2017 02:31:51)
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
Is there a huge point of making a block that likely won't even lag less than a workaround when said workaround barely lags?It lags; just too little to notice if used ONCE. Like @TheMonsterOfTheDeep said, workaroundable, and doesn't lag at all. No support.
go to [Sprite1 v]
go to x: ([x position v] of [Sprite1 v]) y: ([y position v] of [Sprite1 v])
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
Valid point, but that is much more used with inexperienced scratchers than
(letter () of [])And this would likely be even less used. Although I wouldn't be opposed to removing the
go to [ v]block, that's a different topic.
Last edited by duckboycool (Jan. 23, 2017 02:37:03)
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
much more used with inexperienced scratchers thanWhy should it be removed? It takes only a third of the time to run as the alternative that I gave. Valid point, but that is(letter () of [])And this would likely be even less used. Although I wouldn't be opposed to removing thego to [ v]block, that's a different topic.
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
It has some very easy workarounds that don't take more time at all.much more used with inexperienced scratchers thanWhy should it be removed? It takes only a third of the time to run as the alternative that I gave. Valid point, but that is(letter () of [])And this would likely be even less used. Although I wouldn't be opposed to removing thego to [ v]block, that's a different topic.
Last edited by duckboycool (Jan. 23, 2017 03:08:28)
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
The workaround that I gave is three times as laggy.It has some very easy workarounds that don't take more time at all.much more used with inexperienced scratchers thanWhy should it be removed? It takes only a third of the time to run as the alternative that I gave. Valid point, but that is(letter () of [])And this would likely be even less used. Although I wouldn't be opposed to removing thego to [ v]block, that's a different topic.
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
It is still a fraction of a second, and the workarounds for this block are not 3 times as laggy as the block would be.
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
This is how I understand processing time: It is still a fraction of a second, and the workarounds for this block are not 3 times as laggy as the block would be.
Every command on Scratch, from performing a simple action to retrieving a value to updating a variable, takes one processing power.
go to [ v]takes one processing power because it's a simple action with no inner actions. Retrieving
([x position v] of [Sprite1 v])and
([y position v] of [Sprite1 v])EACH takes one processing power because they are two separate values. Combined with the one action required to actually run
go to x: () y: (0),
go to [Sprite1 v]takes three processing powers.
go to x: ([x position v] of [Sprite1 v]) y: ([y position v] of [Sprite1 v])
Last edited by dvargasews (Feb. 27, 2017 03:56:42)
- duckboycool
-
1000+ posts
A new operators block, similar to (letter () of [])
Scratch -snipmay do things on the same frame when they are in a block like this, so that is not how to estimate the time required for something to happen. Besides the go to block still needs to process actually moving them to both x and y, so it's not very different.
Last edited by duckboycool (Jan. 23, 2017 03:54:30)
- TheMonsterOfTheDeep
-
1000+ posts
A new operators block, similar to (letter () of [])
once, but my project will be heavily reliant on them.Really? I did a quick benchmark where I ran the block 100,000 times and grabbed 50 characters, and the longest it took (with run without screen refresh) was 15 seconds, which was with the recursive block. The others were about 8 seconds. Yes, this is significantly longer than something like JS - where this same benchmark takes 1 ms (I think), but I still find it hard to believe that it's a real problem. They're not laggy if used
I can't tell what you're trying to say here… I do not know that Scratch 3.0 will not include a “launch” block (like Snap!'s).
…What? What do you mean? You're making a suggestion for Scratch; I don't see how Snap I can't do run without screen refresh in my project because scripts don't automatically run without screen refresh in Snap!! is at all relevant.
Could you give some estimate of how much you are going to need this block? As it were I am skeptical that having to workaround this block manually will cause enough lag relative to the rest of your project to make it unuseable. or using it a lot, which my project will do.
My point was that if you are using the join block I have no idea what users of the finished project will input.at all, you will not have strings more than 10240 characters, because the join block will not return strings that are longer than 10240 characters. (I think - the number might be slightly different, but it's very close).
https://scratch-mit-edu.ezproxyberklee.flo.org/discuss/topic/235390/When did I say that what you are suggesting is advanced? What I said is that data manipulation - which is what you need this block for - is generally an advanced topic. How is what I'm suggesting advanced? To me, advanced is like
Compared to that, what I'm suggesting is child's play.
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
Which method did you use? If it's the method that only works some of the time and doesn't have the multiuse-preventers, that's important because that means that the version that I'd use would take more time.once, but my project will be heavily reliant on them.Really? I did a quick benchmark where I ran the block 100,000 times and grabbed 50 characters, and the longest it took (with run without screen refresh) was 15 seconds, which was with the recursive block. The others were about 8 seconds. Yes, this is significantly longer than something like JS - where this same benchmark takes 1 ms (I think), but I still find it hard to believe that it's a real problem. They're not laggy if used
It runs two scripts at once.I do not know that Scratch 3.0 will not include a “launch” block (like Snap!'s).
Whoops! Fixed that. I can't tell what you're trying to say here……What? What do you mean? You're making a suggestion for Scratch; I don't see how Snap I can't do run without screen refresh in my project because scripts don't automatically run without screen refresh in Snap!! is at all relevant.
Add the number of blocks that you use in a typical project to double the number of inputs in said project to get a bare minimum.Could you give some estimate of how much you are going to need this block? As it were I am skeptical that having to workaround this block manually will cause enough lag relative to the rest of your project to make it unuseable. or using it a lot, which my project will do.
I'll be using a list. (Also, it's probably 10,240 because 10,240=2^11*5)My point was that if you are using the join block I have no idea what users of the finished project will input.at all, you will not have strings more than 10240 characters, because the join block will not return strings that are longer than 10240 characters. (I think - the number might be slightly different, but it's very close).
Data manipulation is like calculus; the name sounds over five times as threatening as the subject actually is.https://scratch-mit-edu.ezproxyberklee.flo.org/discuss/topic/235390/When did I say that what you are suggesting is advanced? What I said is that data manipulation - which is what you need this block for - is generally an advanced topic. How is what I'm suggesting advanced? To me, advanced is like
Compared to that, what I'm suggesting is child's play.
Last edited by dvargasews (Jan. 23, 2017 14:46:28)
- TheMonsterOfTheDeep
-
1000+ posts
A new operators block, similar to (letter () of [])
I don't want to do more quoting because it's tiring, but there's two points I want to discuss more:
a) Why is your project doing string manipulation in multiple threads? That's not going to work out very well. If you only do string manipulation in one thread than the workarounds I have posted are sufficient. Sure, it doesn't workaround the block at a fundamental level - but I can't imagine a situation where a project would need this block in multiple threads.
b) I've become a bit too fixated on the phrase “data manipulation.” What I mean is doing the particular kind of data manipulation you would need this sort of block for - that is, parsing, and related topics. Those things are advanced topics - at least, they're advanced relative to Scratch.
But you still haven't answered my question about why Snap! is relevant, or given an estimate on how much you would actually need this block.
Now I know that the amount you in particular would need this block is rather irrelevant, as it's possible that there is somebody out there that absolutely does need it - but I can't imagine such a situation so you'll need to help me out there. If your project is actually slow enough to warrant the necessity of this block than I will probably reverse my position, but I seriously doubt that that is the case. I would also reverse my position presented an example of any other project where this block is an absolute necessity - but I'm pretty sure that such a project doesn't really exist, or is very rare.
a) Why is your project doing string manipulation in multiple threads? That's not going to work out very well. If you only do string manipulation in one thread than the workarounds I have posted are sufficient. Sure, it doesn't workaround the block at a fundamental level - but I can't imagine a situation where a project would need this block in multiple threads.
b) I've become a bit too fixated on the phrase “data manipulation.” What I mean is doing the particular kind of data manipulation you would need this sort of block for - that is, parsing, and related topics. Those things are advanced topics - at least, they're advanced relative to Scratch.
But you still haven't answered my question about why Snap! is relevant, or given an estimate on how much you would actually need this block.
Now I know that the amount you in particular would need this block is rather irrelevant, as it's possible that there is somebody out there that absolutely does need it - but I can't imagine such a situation so you'll need to help me out there. If your project is actually slow enough to warrant the necessity of this block than I will probably reverse my position, but I seriously doubt that that is the case. I would also reverse my position presented an example of any other project where this block is an absolute necessity - but I'm pretty sure that such a project doesn't really exist, or is very rare.
- dvargasews
-
500+ posts
A new operators block, similar to (letter () of [])
because multiple threads could be running at the same time in actual Scratch, which this project simulates I don't want to do more quoting because it's tiring, but there's two points I want to discuss more:
a) Why is your project doing string manipulation in multiple threads? That's not going to work out very well. If you only do string manipulation in one thread than the workarounds I have posted are sufficient. Sure, it doesn't workaround the block at a fundamental level - but I can't imagine a situation where a project would need this block in multiple threads.
How is using the “join” block advanced? I get that you're trying to say that what you call data manipulation b) I've become a bit too fixated on the phrase “data manipulation.” What I mean is doing the particular kind of data manipulation you would need this sort of block for - that is, parsing, and related topics. Those things are advanced topics - at least, they're advanced relative to Scratch.can be advanced, but not all of it is.
! is relevant,That was a typo! But you still haven't answered my question about why Snap
or given an estimate on how much you would actually need this block.
<snipped the unimportant parts>It runs two scripts at once.I do not know that Scratch 3.0 will not include a “launch” block (like Snap!'s).Whoops! Fixed that. I can't tell what you're trying to say here……What? What do you mean? You're making a suggestion for Scratch; I don't see how Snap I can't do run without screen refresh in my project because scripts don't automatically run without screen refresh in Snap!! is at all relevant.Add the number of blocks that you use in a typical project to double the number of inputs in said project to get a bare minimum.Could you give some estimate of how much you are going to need this block? As it were I am skeptical that having to workaround this block manually will cause enough lag relative to the rest of your project to make it unuseable. or using it a lot, which my project will do.My project will be heavily reliant on either this or the workaround that I use for input-evaluation.<snipped the unimportant parts> I have no idea what users of the finished project will input.
If you're going to give me so many critique and helpful tips, you might as well be a part of the collaboration, since I'll have to put you in the Notes and Credits section anyway. Welcome aboard! Now I know that the amount you in particular would need this block is rather irrelevant, as it's possible that there is somebody out there that absolutely does need it - but I can't imagine such a situation so you'll need to help me out there. If your project is actually slow enough to warrant the necessity of this block than I will probably reverse my position, but I seriously doubt that that is the case. I would also reverse my position presented an example of any other project where this block is an absolute necessity - but I'm pretty sure that such a project doesn't really exist, or is very rare.
Last edited by dvargasews (Jan. 23, 2017 15:04:55)
- TheMonsterOfTheDeep
-
1000+ posts
A new operators block, similar to (letter () of [])
So note that I am not entirely against the implementation of this block, even if it seems that I am. I notice that I have been slightly too defensive - I would like to apologize for that.
The main point I would like to argue is the educational benefit of having to solve a problem that exists in almost every programming language - that is, learning how to walk through a data structure with a loop.
Of course this isn't a hard to understand topic, but being forced to figure out the solution for yourself has, I think, a non-trivial educational benefit.
It certainly taught me a lot.
Now there are a lot of benefits to implementing a block like this. It is available in other programming languages, so it would seem that it should be available in Scratch as well. I'm honestly not against its implementation - rather I merely would like to see if anybody else thinks the same way I do in terms of the benefit that not implementing it provides.
The main point I would like to argue is the educational benefit of having to solve a problem that exists in almost every programming language - that is, learning how to walk through a data structure with a loop.
Of course this isn't a hard to understand topic, but being forced to figure out the solution for yourself has, I think, a non-trivial educational benefit.
It certainly taught me a lot.
Now there are a lot of benefits to implementing a block like this. It is available in other programming languages, so it would seem that it should be available in Scratch as well. I'm honestly not against its implementation - rather I merely would like to see if anybody else thinks the same way I do in terms of the benefit that not implementing it provides.
- Discussion Forums
- » Suggestions
-
» A new operators block, similar to (letter () of [])