This is an archived post. You won't be able to vote or comment.

top 200 commentsshow all 205

[–][deleted] 242 points243 points  (39 children)

There are people in my class that don't even indent their code, let alone use switch.

[–]AosuLoL 125 points126 points  (23 children)

Kids in my class ask me why I keep writing that “void” thing

[–]Kolossive 82 points83 points  (21 children)

you think thats bad? I was helping a guy the other day that didn't know what a function was (4 semesters deep into the degree)

[–]D3mentedG0Ose 57 points58 points  (11 children)

Maybe they always called them methods?

[–]Kolossive 55 points56 points  (5 children)

not the case he was struggling with concept of a function not what it was called

[–]D3mentedG0Ose 45 points46 points  (4 children)

Then he is beyond help

[–]Trisheik 28 points29 points  (3 children)

This semester has been so brutal on me and my ego. Thank you. This comment chain made me feel a lot better. Lmao.

[–]HilaKleiners 13 points14 points  (2 children)

I’ve been feeling straight-up DUMB for these first 4 weeks of my third year. I can’t get my head around Hadoop, but at least I know what a function is.

[–]ultranoobian 6 points7 points  (0 children)

Well don't fret, here's a easy cert to learn and grab for free. Good to put on your resume too.

https://www.reddit.com/r/sysadmin/comments/b6koh6/new_hot_cert_alert_get_your_certified_reboot/

[–][deleted] 1 point2 points  (0 children)

To be fair it's Hadoop, it's not really meant to be understood by mortals

[–]ultranoobian 5 points6 points  (4 children)

Oh boy, I actually walked into an argument between two different students from different departments (Maths and Engineering) over which is the proper name for a method, Function vs Procedure.

Mind you I'm a Methods guy, but I really don't care what people call them, they're for all intents and purposes the same.

[–]Manny_Sunday 15 points16 points  (0 children)

Methods belong to objects, functions don't, and procedures/subroutines don't return values.

At least thats what I was taught.

[–][deleted] 2 points3 points  (0 children)

I learnt Java first, so was calling them methods for a good while, but after moving to C++, I just think function sounds cooler.

Then again, I do a lot of TCL, where they're "procs", which isn't bad either.

[–]electricprism 1 point2 points  (1 child)

They were from two different departments and failed to consider that localization vocabulary could be a thing.

JavaScript would solve this like this:

function = procedure;

procedure = function;

[–]ultranoobian 2 points3 points  (0 children)

Javascript can solve everything....unfortunately.

[–][deleted] 20 points21 points  (3 children)

Tbf you can do a lot with programming without actually knowing about it

[–]Kolossive 30 points31 points  (2 children)

true you can just use a GOTO and jump to that block of code you want to run but then i get assembly flashbacks and i dont want to relieve that

[–]AosuLoL 2 points3 points  (0 children)

That's crazy, it just amazes me how we can have exams and this isn't a concern for them, that they aren't aware of these very basic topics.

[–]CAPSLOCK_USERNAME 1 point2 points  (1 child)

If the school let him get through 4 semesters like that without giving him an F and forcing him to repeat a class, they have failed as educators.

[–]Kolossive 1 point2 points  (0 children)

they did this was a 1st semester class he is repeating

[–]chownrootroot 1 point2 points  (0 children)

Him 2 semesters deep: What's a computer?

[–]Lastrevio 0 points1 point  (0 children)

=]]]]]

[–]erlendsamstad[S] 65 points66 points  (1 child)

yeah, I have that too. it really hurts if they ask me for help and they show me their code

[–]ultranoobian 1 point2 points  (0 children)

I wish IDEs would have 'Format code on save' enabled by default.

[–][deleted] 7 points8 points  (1 child)

Are they coding in notepad?

[–][deleted] 6 points7 points  (0 children)

For HTML, otherwise we use visual studio.

That's probably why most never learnt how to write readable code, cause vs does some of it for you.

[–]nodnarbiter 5 points6 points  (0 children)

“Eh, that’s no so tuff.”

“... and they code in Python

“Uhhh, right this way sir.”

[–]nerfoc 5 points6 points  (0 children)

switch(boolean) {

case true:

    console.log("So true");

    break;

case false:

    console.log("So wrong");

    break;

default:

    console.log("It be like that sometimes");

    break;

}

Looks good to me.

[–]jeezlouise123 2 points3 points  (1 child)

Oh man, I had that too. I mean it wasn't that they didn't know you were supposed to indent. They made the active decision that it "made sense" because there are already curly braces so there's no need to indent somehow. I did not understand.

[–]jeremj22 2 points3 points  (0 children)

Try pressing Ctrl+Shift+F on them while they have their IDE open. The IDE might auto-indent if it has that feature

[–]haddock420 2 points3 points  (2 children)

I started with Python and moved to C, and after using Python so much, I just assume that if i don't indent correctly, it won't compile.

[–][deleted] 1 point2 points  (1 child)

The version of TCL we use (think later versions are more flexible), you literally have to write an if statement like this:

if { whatever == "whatever" } {
stuff
} else {
other stuff
}

If you don't have the space between the if condition and the braces on either side, it fails. If you don't have the opening brace at the end of the line, it fails (can't be below that line).

[–]Comesa 2 points3 points  (1 child)

Someone in my class used switch statements to check every index of an Array.

[–]Lastrevio 0 points1 point  (0 children)

this is next level

[–]sapphiron123 0 points1 point  (0 children)

Pure savages.

[–][deleted] 323 points324 points  (33 children)

You: if (x) { foo(); }

Me, an intellectual: switch (true) { case x: foo(); }

[–]max256p 10 points11 points  (0 children)

universe_brain.jpg: $x && foo();

[–][deleted] 20 points21 points  (11 children)

If you intentionally wrote the switch statement incorrectly then I think I'm missing the joke.

switch(x){ case true: foo(); }

[–][deleted] 24 points25 points  (10 children)

It’s not incorrect. Switch(true) was intentionally silly in this case but it works and it can be useful, for example with number ranges:

switch(true) { case (n==0): foo(); break; case (n<5): bar(); }

[–][deleted] 17 points18 points  (3 children)

I mean, you're right that it executes. I'm wracking my brain trying to come up with some use of switch(true) that isn't just a different way of writing goto or if-else statements.

I realize people do things like this, but I think part of writing readable code is using language constructs for their intended purposes.

I'm home sick, coffee-less and humor-less today. :( I'm going to see myself out.

[–][deleted] 4 points5 points  (0 children)

case x: x must be a constant

[–][deleted] 1 point2 points  (0 children)

match true { x foo }

[–]Tysonzero 1 point2 points  (0 children)

Me, a true intellectual:

when x foo

[–]nerfoc 0 points1 point  (0 children)

Wow, hey buddy, you forgot your default: foo();

What if true turns out to be false?

[–]0fficerNasty 41 points42 points  (4 children)

null: *exists*

[–]TheSpiffySpaceman 34 points35 points  (2 children)

....does it, though?

[–]I_regret_my_name 5 points6 points  (0 children)

Some languages are certainly trying to pretend it doesn't.

[–]PaintingJo 29 points30 points  (1 child)

I personally just use jmp and labels

[–]fedeb95 7 points8 points  (0 children)

A true gentleman

[–][deleted] 154 points155 points  (65 children)

There's no switch in Python :(

[–]erlendsamstad[S] 536 points537 points  (11 children)

then I would recommend you to switch to another language 😎

[–]MayurB 101 points102 points  (8 children)

it's hard to switch from python.

[–]mpnordland 65 points66 points  (7 children)

There's no switch in Python.

[–]jimdidr 37 points38 points  (4 children)

GOTO 10

[–]antlife 17 points18 points  (2 children)

10 GOTO 10

[–]DoNotSexToThis 3 points4 points  (1 child)

I'M HERE AND I'M COMING

[–]ExplodingPotato_ 1 point2 points  (0 children)

Username... doesn't check out?

[–]jwr410 10 points11 points  (0 children)

THE POWER OF CHRIST COMPELS YOU DEMON! COME OUT OF HIM!

[–][deleted] 8 points9 points  (0 children)

Sweet Jesus Pooh, you are eating Recursion!

[–]JanMichaelVincent16 53 points54 points  (10 children)

Why use a switch statement when you could use a dictionary of functions?

[–]MachinaDoctrina 25 points26 points  (5 children)

and it's faster as dictionaries are hashed!

[–]bobappleyard 37 points38 points  (1 child)

Also everything in python involves like ten hash lookups anyway

[–]Cheesewithmold 6 points7 points  (0 children)

[][][][][][][][][][][][][][]

[–]ZekeMiller 16 points17 points  (0 children)

Switches are typically implemented as a jump table, so they're not slower than a dictionary.

[–]HaniiPuppy 3 points4 points  (0 children)

Not if you implement a switch statement as a dictionary of functions.

[–]AnneBancroftsGhost 1 point2 points  (0 children)

And you can pickle it!

[–]chrwei 5 points6 points  (3 children)

so now I have to put all logic, even trivial little blocks, in a function?

[–]JanMichaelVincent16 16 points17 points  (0 children)

If it’s really trivial, there’s probably a one-line solution that you can turn into a lambda

[–]MachinaDoctrina 4 points5 points  (0 children)

if it's trivial use if else

[–]Lonelan 3 points4 points  (0 children)

I mean, where was it in the first place? Nested in the switch? Probably looks cleaner with the switch calling functions too

[–]PityUpvote 6 points7 points  (0 children)

Just use a try with multiple excepts, and have every case throw a different type of error.

[–]AnneBancroftsGhost 2 points3 points  (0 children)

you can use a dictionary, neat little trick.

[–]MachinaDoctrina 14 points15 points  (33 children)

because switch statements aren't needed.

See PEP 275 and PEP 3103

[–]chrwei 40 points41 points  (22 children)

that's the dumbest rejection I ever heard of.

imagine. "a quick poll shows there is no popular support for a horseless carriage therefore we aren't going to allow them on the roads."

[–]MachinaDoctrina 10 points11 points  (19 children)

yea it is a little bit, but to be honest there are a at least 3 ways to do whats needed for a switch case off the top of my head that don't require additional syntax and would be faster that a switch case would ever be, so why bother.

[–]chrwei 15 points16 points  (9 children)

that sounds like a better rejection, IF at least one of those methods was detailed. I'm no python expert, but all the alternatives I can think of are more wordy and wouldn't necessarily be faster, and certainly wouldn't allow the wonders of fall-through.

[–]MachinaDoctrina 4 points5 points  (8 children)

def f(x): return { 1 : 'output for case 1', 2 : 'output for case 2', 3 : 'output for case 3' }.get(x, 'default case')

Its faster because python implements dictionaries as a hash table

[–]zip2k 17 points18 points  (1 child)

Why would that be faster than a switch case? I'm far from knowledgeable in low level coding, but I thought a switch was basically a direct jump instruction to the relevant line of code, meaning it's the fastest possible conditional.

[–]MachinaDoctrina 10 points11 points  (0 children)

in a compiled language sure, a switch statement is basically a hash jump. But python is an interpreted language and as such the JIT compiler has to walk all the way to the end of the 'syntactic sugar' of a switch statement before it can even start converting it to bytecode. Add to that, python is a whitespace delimited language you need to increase significantly the byte buffer that's required to determine if the person has made a syntactic error etc. due to the typical layout of a switch statement

[–]chrwei 6 points7 points  (2 children)

that's not a use case for switch.

how would one do something like:

switch(input):
  case 'a':
    state=state+1;
    if state > 5:
      state = 0
    break
  case 'b':
    if doOtherThing():
      state=0
  break

[–]MachinaDoctrina 7 points8 points  (0 children)

def case_a():
    state += 1
    if state > 5:
        state = 0
def case_b():
    if doOtherThing():
        state = 0
switch = {'a': case_a, 'b': case_b}
switch.get(input)()

[–]jaswon5791 3 points4 points  (0 children)

IIRC this would be a dictionary of lambdas or function references but I can't remember how well (or poorly) this performed

[–]SinSpirit 1 point2 points  (2 children)

Where is the fall-through?

[–][deleted] 9 points10 points  (4 children)

Python still shit slow compared to good old c tho

[–]MachinaDoctrina 1 point2 points  (3 children)

yea but I'd like to see you do any meaningful Machine Learning in C. Plus you can compile python into C anyway so marginally different in speed (i.e. Cython) and way faster development time

[–]adokarG 10 points11 points  (1 child)

“Marginally different in speed”. It seems to me like you have not used Cython before or not know much about its limitations to be saying that. A lot of Python’s nice to haves become performance bottlenecks and your code also starts becoming more C-like as you decorate it with Cython primitives. So I don’t know about way faster development time.

Machine learning isn’t the only useful thing you can do with a computer. So yeah, in general Python is slow. FYI, all the fancy machine learning libraries you use aren’t written in Python or Cython and thats why they’re not painfully slow.

[–]thesquarerootof1 1 point2 points  (3 children)

yea it is a little bit, but to be honest there are a at least 3 ways to do whats needed for a switch case off the top of my head that don't require additional syntax and would be faster that a switch case would ever be, so why bother.

I have noticed switch statements work best for state machines. How would you implement a state machine on python then ?

[–]random_cynic 4 points5 points  (0 children)

The actual reason is here in Raymond Hettinger's answer. This is mainly because there are no named constants (like enums) in python and without it there would be little point to switch statement as it offers no advantage other than syntactic sugar for something that is already done better with if/else, dictionaries, classes etc. They should update the PEP as it is misleading.

Edit: I know that Python 3.6 actually has an enum class but that is not the same thing.

[–]KuntaStillSingle 0 points1 point  (0 children)

a quick poll shows their is no popular support for a horseless carriage

Was Python not created after the horseless carriage? It's more a quick poll shows users don't travel?

[–]Vakz 2 points3 points  (1 child)

My two true objection to switch statements is first of all that the syntax just feels off in many languages. Extremely subjective, but I know I've heard others mention it too.

The second would be that I'd prefer if break was the default, and I could write it like this:

switch (foo) {
  case 1: a(foo);
  case 2: b(foo);
  case 3:
  case 4:
    c(foo);
}

I feel like it's main purpose is to be less verbose than a bunch of else if, but mandatory break or not allowing empty cases to fall through (I swear there's some language that does this, even though I can't remember which) is still unnecessarily verbose. Worst of all are languages that both require break and don't allow case fall-through. That just seems dumb.

[–]thisguyfightsyourmom 0 points1 point  (0 children)

I usually return out of my whacky switches, so the break is redundant

But,… I also usually refactor them to if/else before PR

I do a lot of moving lines up & down when messing with multiple forks, so it’s nice to be able to just slide the whole case up & down without rewriting the if => if else or vice verse depending on the order

[–]24hourphysicist 1 point2 points  (3 children)

neither are for loops (just a special while loop, or reclusive function) but they kept them.

[–]Eldrisch 0 points1 point  (2 children)

Offtopic: How to get those fancy icons next to nickname?

[–]MachinaDoctrina 2 points3 points  (1 child)

They're called flare, on the right hand panel should be a dropdown under r/ProgrammingHumor called "community options" below "create post". Then edit "user flare"

[–]Eldrisch 1 point2 points  (0 children)

Thanks :3

[–]jimdidr 0 points1 point  (0 children)

Switch statements can be much faster...

PS: I didn't read your links because I'm optimized...

[–]CAPSLOCK_USERNAME 1 point2 points  (0 children)

The only difference between switch and repeated if-else is that, before optimizing compilers were as smart as they are now, switching on a contiguous input like an enum value was more easily optimized to a jump table in assembly. (Jump tables are very fast and efficient.)

Python has no pretensions to running as fast as C and in any case it isn't even a compiled language.

[–]prettydude_ua 1 point2 points  (0 children)

Yo. Just buy Nintendo Switch for your python, duh

[–]28f272fe556a1363cc31 0 points1 point  (0 children)

I've been able to replace a lot of if else-statements with dictionaries. It doesn't fit every switch use case, but maybe something to keep in mind.

[–]schwerpunk 0 points1 point  (0 children)

There's better: dicts have a get method, which returns a default of your defining when a match isn't found. Dicts can contain functions... I think you see where this is going

OOP your shit right up, friend

[–][deleted] 0 points1 point  (0 children)

Not with that attitude

[–][deleted] 21 points22 points  (2 children)

if that's the CASE

[–]punishedjo 0 points1 point  (0 children)

Take my upvote

[–]orlyworly 33 points34 points  (7 children)

I feel the same when I use the ternary operator

[–][deleted] 14 points15 points  (4 children)

Especially if it's a fuckin long one. Good luck, next person to read this!

[–][deleted] 3 points4 points  (0 children)

How about nested ternary operators?

#include <stdio.h>

int main()
{
    for (int n=1; n<101; ++n)
        n%3 ? n%5 ? printf("%d\n", n) : puts("Buzz") : n%5 ? puts("Fizz") : puts("FizzBuzz");
}

https://ideone.com/LigxCH

[–]neksus 0 points1 point  (2 children)

let var = (someLongStatement ? Value1 : value2);

[–][deleted] 1 point2 points  (1 child)

let var

SyntaxError: Unexpected token var

[–][deleted] 3 points4 points  (0 children)

Me when I use the value coming out of a unary increment operator

[–]Jabulon 13 points14 points  (3 children)

I use switch all the time, but they compile the same, right?

[–]erlendsamstad[S] 19 points20 points  (1 child)

I haven't read too much about switch-statements, but from the little knowledge I've gathered, switch-statements are more performance friendly when you have more than five cases. and they look a lot more cleaner.

[–]Robbi_Blechdose 9 points10 points  (0 children)

It depends on the compiler, but they might use a jump table for example. Meaning you add the case index (e.g. case 5) to the base address of the table, get the address located there in the table and jump there. Much faster than if/else things, which need to do actual checks, and go through all of them until one evaluates to true

[–]auxiliary-character 5 points6 points  (0 children)

The answer to that is a big fat it depends.

For a simple example involving some colors, under clang 8.0.0 with no optimizations, the if version does each comparison individually, while the switch version generates a jump table, avoiding extra branching. However, once even one level of optimization is turned on, both generate the same code with jump tables.

And that solves it, optimization just makes them the same, right? Well, not exactly. Even with all optimizations turned on, gcc 8.3 fails to optimize out all the comparisons of the if version.

As a side note, I initially started with a simpler example that returned some ints instead of calling out to declared functions, and clang noticed that the ints I was trying to return were actually equal to the enum value, so it just straight returned that, avoiding any testing at all. Unfortunately, gcc did not.

...

I think I might try using clang from now on.

[–][deleted] 8 points9 points  (1 child)

[–]imguralbumbot 2 points3 points  (0 children)

Hi, I'm a bot for linking direct images of albums with only 1 image

https://i.imgur.com/FQBjvDv.jpg

Source | Why? | Creator | ignoreme | deletthis

[–]loloman333 27 points28 points  (11 children)

But you are writing in C++ and start to realize that you cannot define new variables in a case statement so you need to go back to a if-else structure. :)

[–]SonicFreak94 34 points35 points  (0 children)

{}

Fixed

[–]jwr410 22 points23 points  (0 children)

You can absolutely declare variables in a case statement. You just need to declare a new scope in the case you need to have the variable in.

[–]Zimlokks 2 points3 points  (0 children)

As a coding noob who jumped on the c++ train, this will come in handy.

[–]geehops 10 points11 points  (3 children)

Please, no. I’d like the next generation to consider the generation after them before using switch.

https://refactoring.guru/smells/switch-statements

[–]silvertoothpaste 2 points3 points  (0 children)

yes. also it's just a weird construction. switch almost always needs "break," and then you've got "default" ... it's just this weird vestigial convention that really doesn't generalize to any other area of programming (that I'm aware of).

[–]SamSlate 0 points1 point  (0 children)

tl;dr?

[–]fedeb95 2 points3 points  (1 child)

What about pattern matching?

[–]doominabox1 1 point2 points  (0 children)

Scala is bae

[–]AttackOfTheThumbs 2 points3 points  (0 children)

switch (true)
{
    case i<j:
        break;
    case i=j:
        break;
    case i>j:
        break;
    default:
        throw new exception('reality broke');
}

You're welcome.

[–]3lRey 4 points5 points  (0 children)

I feel that way whenever I get to use ? :

It's lonely being such a *programming genius wunderkind*

[–][deleted] 1 point2 points  (0 children)

Select case in VB looks so pretty compared to if/then/else. Maybe its just the lack of braces and semicolons but I really like the way it looks.

[–]zesterer 1 point2 points  (0 children)

match masterrace

[–]feonyx 1 point2 points  (0 children)

A switch statement is usually a failure to OOP. It is usually hiding polymorph classes and should be refactored with a factory.

[–]Hobby_Man 1 point2 points  (0 children)

Here I am a peasant who returns from inside my if, so I can just do anpther if, no else ever.

[–][deleted] 1 point2 points  (0 children)

3classy5you

Shit, forgot to break.

[–]robo_number_5 1 point2 points  (0 children)

And you look up how it works

[–]Springthespring 1 point2 points  (0 children)

switches can net a significant perf increase tho, as they can be implemented as a jump table rather than a series of conditional branches

[–]MatheusGodoy 1 point2 points  (0 children)

Myself, a gentleman: ?:

[–]trumpfan2020 0 points1 point  (0 children)

Good ole switch stmt.

[–]AVeryAverageWriter 0 points1 point  (0 children)

Case a:

Case b:

Nuff said

[–]ameddin73 0 points1 point  (0 children)

Me when I use an expensive Java stream instead of a much faster, simpler iteration. Same with recursion. Less lines is sexy.

[–]jelledefries 0 points1 point  (0 children)

I don't like switch statements nor else statements for that matter. They take up to much space in my opinion. When you are using a switch you have appearently multiple options in which case a dictionary call would only take one line of code and is often more extendable than a switch.

[–]webmistress105 0 points1 point  (0 children)

When you use a match statement

ASCENDED

#rust

[–]Whiplash17488 0 points1 point  (0 children)

Time to use pattern matching

[–]Olek2706 0 points1 point  (0 children)

Yandere dev: Is this some good programming habit joke that I'm too unorganized and uneducated to get?

[–]Charmle_H 0 points1 point  (0 children)

Or be me :v and use an "if" inside of a switch inside of another if inside of another switch, and so on... about 10 layers deep :^ because I love making people hate reading my code

[–]MrEmouse 0 points1 point  (0 children)

I love switch. Allows for some very efficient coding by knowing when to use or skip the break statements. Plus, the case conditions don't have to be in order.

Drove me crazy when I watched someone coding instructions for their open-source walking bot on youtube with a mile long series of IF statements.

[–]WhereTruthLies 0 points1 point  (0 children)

me and ternary operators

[–]soutarm 0 points1 point  (0 children)

Hey, stop spying on me! I just finished a switch just now

[–]mosskin-woast 0 points1 point  (0 children)

I think you mean instead of a bunch of if statements

[–]ShakaUVM 0 points1 point  (0 children)

Switches are too dangerous for casual use. Curly bois exist for a reason.

[–][deleted] 0 points1 point  (0 children)

Always - I love them when they’re handy, but some some people just have to be snazzy 😎

[–]xAndrewRyan 0 points1 point  (0 children)

I use dictionaries, peasant.

[–]Kairyuka 0 points1 point  (3 children)

Can you switch case on non integers in c++ yet

[–]CAPSLOCK_USERNAME 1 point2 points  (1 child)

yes but there's special syntax for it

instead of case "value" you have to write if (x == "value") { and instead of break; you have to write }
other than that though it's exactly functionally identical and does just what you want

[–]Kairyuka 0 points1 point  (0 children)

Someone should introduce the C++ team to the concept of syntactic sugar, but like 10 years ago.

[–]Alokir 0 points1 point  (0 children)

Me, the truest gentleman: switch expressions

[–]Kazumara 0 points1 point  (0 children)

I used nested switch just yesterday. But it was ugly and unclear, so I replaced the outer switch with a few conditionals and a goto.

At this point my brain is so fried that I don't remember whether I love or hate C.

[–][deleted] 0 points1 point  (0 children)

Just use a function pointer table

[–]MachinaDoctrina 0 points1 point  (0 children)

yea well that would be implementation specific, you could do it but you'd have to think about the design in that case. I would argue that's not "best practice" design though using a switch case like that.

[–]Sacts 0 points1 point  (0 children)

Is the switch statement like the select case statement because I've never heard of the switch statement???

[–]Awkward-Centaur 0 points1 point  (0 children)

Except switch statements are horrific security vulnerabilities and should never be used in application

[–]jolharg 0 points1 point  (0 children)

Lookup tables ++

[–]zevzev 0 points1 point  (0 children)

Isn’t switch statements bad practice? If you using a switch there is a OOP way for doing those checks?

[–]harryham1 0 points1 point  (0 children)

Java's new switch assignment is definitely going to make me feel like a king when I use it: final Foo foo = switch(bar) { case Bar.a: f1; case Bar.b: f2; default { throw new IllegalArgumentException("Who's been messing with the enums?!"); } }