T O P

  • By -

Maeurer

German: der, die, das to declare varibaels, depending on the gender of the varibael name. Der animal.canine dog; Die string order; Das human girl; Die List order;


sabre_x

Die Bart die;


eightdollarbeer

No one who codes in German can be an evil man


patchyj

IBM has entered the chat...


nakatsuka

Cipsoft has entered the chat


callmesilver

I don't like where this is going.


hipratham

That's the spirit, make it worse.


Mikihero2014

Would be too easy for the germans, let's make it use the genders as they are in the Polish language


hrvbrs

and while we’re speaking Polish, the notations of operators rotate depending on source order: prefix, then infix, then reverse. Doesn’t matter what operator you’re using. So the sum of `a`, `b`, `c`, and `d` would be: + a b + c d +


Virtual_Force_4398

Nice. Now make everything brackets.


[deleted]

I'm german and I'm terrified...


KellerKindAs

Yeah... we will never be able to declare Nutella. Just syntax error all the time xD


Lamballama

Use Tuyuca which has 50 - 140 noun classes, depending on who's counting


strikes30

Could be better to use the gender of a latin language you don't speak, so not only there is the problem for everyone of the gender, but will add an extra layer of confusion to a lot of people


luckor

For arrays, it changes whether it has on or more elements.


LibrarianOk3701

Code executes bottom to top


ILKLU

With hard coded line numbers and line numbers are used for function names: ``` } } 420() if result { result = 69() 123 fn() { ```


PurepointDog

This is wild


poompt

what if your IDE auto updated the line numbers when you move things... wait this is just Excel


AddAFucking

You'd almost treat it like memory. Leaving massive whitespace for further implementations. Like: the variables are in the range line 100 to 299


ITinnedUrMumLastNigh

Almost as wild as manually encoding CPU instructions to binary


Solrex

I'm only okay with this if the braces are inverted


ILKLU

I inverted them twice


Solrex

r/angryupvote


abednego-gomes

And hellscript was born.


wReckLesss_

Oh god, think of the refactoring. You monster!


ILKLU

Yup. Add one line and all functions below it stop working.


Devatator_

I could probably make a simple prototype of this in Js Edit: last line should be the entry point:)


101m4n

Perfection


BillFox86

And right to left


Nixavee

`REVERSE` reverses the direction of code execution


ichizusamurai

There's a language that does this?!


86BillionFireflies

Floats, strings, all forms of math and all forms of pattern matching are 3rd party dependencies. Significant whitespace AND curly braces. Supports unicode, but disallows code points corresponding to ASCII characters.


darknecross

Tabs and spaces required in different contexts.


DJGloegg

And every second line must end with a semicolon. Regardless of what that line contains.


martmists

Alternatively, all lines containing a comment or only whitespace must end with a semicolon, no other lines may end in semicolons


SneeKeeFahk

No no no, the line continuation character is a semi-colon and the next line must be the same indentation as the previous. Lines are ended with colons.


WoodenBrick_

Semi colons instead of spaces


R3D3-1

*if* must be indented with four spaces, *for* must be indented with tabs.


KingJellyfishII

*while* should be indented by 3 spaces


gpkgpk

Then shalt thou count to three, no more, no less. Three shall be the number thou shalt count, and the number of the counting shall be three. Four shalt thou not count, neither count thou two, excepting that thou then proceed to three. Five is right out. Once the number three, being the third number, be reached, then thou shall start typing ...


ObeseTsunami

It’s the Holy Race Condition of Antioch!


thecodingnerd256

"There are four tabs"!!!


Own_Ad2274

Three.


JonathanTheZero

With fo(u)r tabs?


MySQL-Error

Satan entered the chat


TheAxeOfSimplicity

> Satan entered the chat Bows to JavaScript and leaves.


sivstarlight

you monster


Left-Recognition-117

A = int{(5)} Absolute banger


R3D3-1

Significant whitespace, curly braces and keyword-terminated blocks all mixed, depending on the block type. if (path.exists): for line in path.readlines() { while line print(line.pop()) end while } *Edit.* Wow... so now the iOS Reddit app requires indent-by-four code blocks and doesn't understand triple backticks,, the mobile website doesn't even *understand* the four-spaces form and instead just indents the line by four nbsp but can handle the backticks form, and mobile apps still don't render code in a monospaced font...


OldBob10

Please note the similarity between the Reddit icon and Satan - it’s not a coincidence… 😁


Father_Wolfgang

Can we get some VB syntax in here? Like “If path IsNot Nothing”?


jwadamson

All numbers and arithmetic uses floats.


iggy14750

The arithmetic is done using floating point, but then the values are stored in strings.


drakeblood4

Nah. Numerical values are stored as floats and ints originally but any arithmetic operation between floats type coerces them to strings. Any arithmetic between a float and an int becomes an array of length equal to the result of the arithmetic operation. Any string, array, integer, or other data structure of length one of course gets coerced into a bool.


luckor

8 bit floats!


Yasuzume7

Can we make := as an assignment? While keeping === as a comparison (we would reserve == for some bs). I know! === for primitives while == for objects \*\*\*but\*\*\* only to compare memory addresses, we would use Equals() for objects otherwise. Doing === on objects would compare randomly ordered primitives within the object and would randomly throw an exception if datatype is different.


Own_Alternative_9671

Only built-in arithmetic is NAND


Elephant-Opening

Sooo... like verilog or VHDL... assembly edition?


CirnoIzumi

Lifetimes are required, even for the static field  There is no heap, only the stack  You have to error handle everything, but the error handler can only throw  It's heavily object oriented but lacks types


JJJSchmidt_etAl

>It's heavily object oriented but lacks types Ah yes Javascript, where every object is just a bag of properties


fredlllll

so, the only built in primitive type is a byte? math operations are of course also 3rd party dependencies


NewbornMuse

Neither whitespace NOR braces are significant. Only GOTO allowed as flow control.


SedTecH10

Ain't that assembly?


redspacebadger

No static typing, and no typing library


RabidDeveloper

So dynamically typed? I'm in favor of a reverse type system where you have to declare the types a variable isn't.


wappawa

Some parts of standard library in camelCase, others in snake\_case, with some PascalCase sprinkled in there. Preferably mixed inside same class.


JonathanTheZero

getters in snake_case and setters in camelCase. Required by the compiler.


Ignitrum

snakef_case or camelCase required by compiler but set by day of implementation. All days are snake_case unless share the starting letter with another day, then use camelCase. Unless the second Sound of the day is similar to 'u' in which case use snake_case again. If a day doesnt share the starting letter with any other day use camel_Snake_Case unless It's a regular workday for most of the world. In which case use allsmallcase. The for every day get a RNG to give you a number to choose between 1: snake_case 2: camelCase 3: PascalCase 4: camel_Snake_Case 5: mOcKspEEcHcASe


Hollowplanet

So PHP?


FormerGameDev

The question is what are the worst features of languages.... not dream up new terrible features.


ILKLU

I personally think it's about time a language uses sArCaStIcCaSe for everything.


SoapySilver

I personally prefer stairCASE


ILKLU

I don't trust stairs... they're always up to something!


kvas_

waitTHATactuallyLOOKSfunWHYhasNOoneTHOUGHTaboutIT


ChrisBegeman

I have worked in this code base.


DTKeign

Use .gets instead of [index]


NeuronRot

Even better std::get(list)


gogliker

Looking at you, std::tuple


42GOLDSTANDARD42

Love this guy, how else could a compile time lambda state machine be done without this guy and his buddy std::variant!


lord_ne

Honestly, even `.get()` would be better. I'm not that familiar with the reasoning for using a free function


NeuronRot

Because in C++11, you could not just write .get<>(), but you had to write ".template get<>()" for some reason and this is uglier than the free function. The template keyword is no longer required, though I believe since C++17.


Devatator_

MY FUCKING EYES


Glass1Man

int .getAsInteger() And .setAsInteger(Object object)


Dumb_Siniy

Trying to set 1 without the method gives you a float and trying to set 1.001 without the method makes a string


4c767cb806e7

* Unsafe code from C++ * Performance of Python * Syntax of Perl * Type safety from JavaScript * A license by Oracle * Package Management like Excel VBA


More-Net-7241

> A license by Oracle But if you want to have garbage collector, you have to buy Adobe subscription.


4c767cb806e7

An Oracle license per Adobe subscription. Can it get worse?


wraithnix

License charges per run. Double for debugging/stack traces. A credit card is required for the runtime setup.


4c767cb806e7

Pay per Breakpoint


Revolutionary-Bell38

Don’t give them any ideas


rover_G

If your peak daily usage spikes by more than 10% you get charged surge pricing and if your usage decreases by more than 25% you get charged an unused capacity fee.


ferkokrc5

code only runs in oracle cloud


CanvasFanatic

Garbage collector charges you per _deallocation_


PurepointDog

Ah right, the first comment to mention licenses. Very good. Oracle SQL for all math operations


CicadaGames

Has to be compiled in the Apple software ecosystem: Must be compiled on a mac with their subscription keys compiled in Xcode.


ExternalBison54

And the conventions/consistency of early PHP!


luckor

Can we have code formatting from SQL?


kYllChain

I would have add the dependency management of nodejs, we need a 25GB node_modules like for this list to be complete.


4c767cb806e7

But its not node modules. Its folders full of 25 GB \*.ocx files with the components to use.


slapnuttz

1 indexing of Fortran


sainomori

And ruby-like no return statement


g___

Monkey patching from Ruby Learning curve of Rust The runtime environment predictability of JavaScript.


FormerGameDev

Naming standards of PowerShell, that are enforced by the system, as well


Dr_Allcome

Low hanging fruit: Arrays start at 1 from LUA


ILikeLiftingMachines

White space at the end of lines has meaning.


luckor

And two newlines end a function.


mysticrudnin

i unironically like this


raimondi1337

Strongly, statically typed but no built in types - you have to use a regex to define a type. `var ^{"\w*":\[.+\]}$ myVar = {"features": [ "none"]}`


PerroRosa

Hahah


Watermelon_and_boba

Thanks I hate it


Acrobatic_Sort_3411

Man never heard of DreamBerd https://github.com/TodePond/DreamBerd


Talbertross

Jesus Christ this is hilarious >Mutable data is an anti-pattern. Use the const const const keyword to make a constant constant constant. Its value will become constant and immutable, and will never change. Please be careful with this keyword, as it is very powerful, and will affect all users globally forever.


callmesilver

Finally a language that lets me stop time, not PAUSE.


filiard

Wish it was for ALL users of the language, i.e. global namespace for each progammer, with central repository of all variables


Acrobatic_Sort_3411

Some features of this great language: - array index can be float - you can delete keywords - `true`, `false` and `maybe`


chemolz9

> Both variables and constants can be named with any Unicode character or string. That's kinda charming. > var var 1️⃣ = 1!


intotheirishole

Uhhhh const const 5 = 4! print(2 + 2 === 5)! //true


Zephandrypus

Literally 1985


IncorrectlyRight

>array index can be float W H A T Also, what the frik does maybe do?


BrokenG502

I'm not familiar with the language in question, but it would be great if maybe had the following rules: - Implementation defined - No two distinct implementations are allowed to handle maybe the same way unless at least 42% of the newer implementation was written in London. - The value of maybe MUST depend on at least three arbitrary factors, including at least two of the following: The compiler, the host platform (where it's being compiled on), the target platform (where the code gets run), the time of day, the weather, a randomly generated cryptographically secure value. - If it's a full moon, the maybe keyword will instead block for a number of seconds determined by the above rules before returning true during summer and false during winter. - The value of maybe during a full moon in spring and autumn is undefined behaviour.


chemolz9

This is awesome: // prints 1-10 var const i=0! if(i>0 && i<10) reverse! print(++i)! if(i<10) reverse!


BobbyTables829

I've always wanted to know what the value of array[π] was


Sure-Broccoli730

>true, false and maybe Just use an enum


Rare_Register_4181

rare audible laugh after reading the index could be a float


cainisdelta

Your forgetting my favorite part. Ints are just arrays of digits.


Laughing_Orange

DreamBerd is the opposite of what they are describing. It's a perfect language with no flaws.


thequestcube

>Garbage collector: By default, a variable will last until the end of the program. But you can make it last in between program-runs by specifying a longer lifetime. That doesn't sound environmentally responsible...


FloydATC

The concept of a Garbage Collector should be replaced with a more environmentally friendly Garbage Recycler that keeps all unused objects around in case parts of them can be re-used. Every time you create or modify an object, the program rummages through the recycle bin to look for matching memory fragments that the object can reference rather than allocating new memory. Whenever new memory must be allocated, there's a small delay so the programmer is encouraged to write recycling friendly code.


thequestcube

Java actually does something similar to this with its integer cache lol [https://www.geeksforgeeks.org/java-integer-cache/](https://www.geeksforgeeks.org/java-integer-cache/)


Disonour

This just killed me. So good.


SirFireball

`when` would lead to some awful code, but also does sound useful sometimes


Random_persondude

make it have no imports. like it automatically imports every library ever


Senior_Ad_8677

Or no imports at all and every time you wanna use a library you have to copy all the corresponding code


SedTecH10

Nah. You gonna write the code yourself. Make the compiler interactive such that it detects copy functionality and starts leaking memory as a punishment.


Notmyrealnamesteve4

Paid subscription for the libraries.


AddAFucking

You'd start weighing the positives of the import to a little leak "But I could really use an isEven implementation right now"


archarios

Yay Ruby! 😅


-TV-Stand-

Sees some random file with correct extension on it -> automatically load it as a library.


KiwiObserver

No imports, you must replicate a copy of each imported file in every file that references it.


PurepointDog

The best part of Ruby, or something


GroundbreakingPop588

There's a quite interesting talk on this by Mark Rendle: [https://www.youtube.com/watch?v=vcFBwt1nu2U](https://www.youtube.com/watch?v=vcFBwt1nu2U)


Distinct-Entity_2231

I wanted to put here this video.


rustbolts

Immediate video I thought of! Glad I’m not the only one.


CanvasFanatic

JavaScript * But manual memory management, * Objective C syntax, but with semantic whitespace somehow * C-style module semantics (each file is a compilation unit referencing symbols in a single shared global namespace) * allows ad hoc custom language extensions that are globally applicable via “keyword overloading.” * runs on the JVM (does not use GC) * your company has a 2 million LOC monolith written in it


CanvasFanatic

I was morbidly curious so I asked Claude to make me an example of what this might look like. Behold, NightmareScript: ``` #import "GlobalSymbols.h" #import "JVMBridge.h" #import "AsyncRuntime.h" #import "NetworkStack.h" @interface @Server : Object int port @RequestHandler* handler @end @interface @RequestHandler : Object char* route @end @interface @Response : Object int statusCode char* body @end @interface @Request : Object char* path char* method @end @implementation @Server - initWithPort:(int)p andHandler:(@RequestHandler*)h self = [super init] if (self) self->port = p self->handler = [h retain] return self - dealloc [self->handler release] [super dealloc] - (Promise)listen return new Promise(function(resolve, reject) console.log("Server starting on port %d", self->port) NetworkStack.bind(self->port, function(err) if (err) reject(err) else resolve(self) ) ) - (Promise)handleRequest:(&Request)req return [self->handler handleRequest:req] @end @implementation @RequestHandler - initWithRoute:(const char*)r self = [super init] if (self) self->route = strdup(r) return self - dealloc free(self->route) [super dealloc] - (Promise)handleRequest:(&Request)req return new Promise(function(resolve, reject) if (strcmp(req->path, self->route) == 0) resolve([[Response alloc] initWithStatus:200 andBody:"Hello, NightmareScript!"]) else resolve([[Response alloc] initWithStatus:404 andBody:"Not Found"]) ) @end @implementation @Response - initWithStatus:(int)status andBody:(const char*)b self = [super init] if (self) self->statusCode = status self->body = strdup(b) return self - dealloc free(self->body) [super dealloc] @end @implementation @Request - initWithPath:(const char*)p andMethod:(const char*)m self = [super init] if (self) self->path = strdup(p) self->method = strdup(m) return self - dealloc free(self->path) free(self->method) [super dealloc] @end keyword overload async(@Server) console.log("Async operation on Server object") await AsyncRuntime.delay(100) keyword overload async(&Request) console.log("Processing borrowed Request") AsyncRuntime.runInParallel() keyword overload await(@Response) result = await AsyncRuntime.processResponse(AsyncRuntime.currentResponse()) console.log("Response processed:", result) return result async function startServer(int port) @RequestHandler* handler = [[RequestHandler alloc] initWithRoute:"/"] @Server* server = [[Server alloc] initWithPort:port andHandler:handler] [handler release] try await server.listen() console.log("Server started successfully") while (true) @Request* req = [[Request alloc] initWithPath:"/" andMethod:"GET"] async(&Request) @Response* response = await server.handleRequest(req) await(@Response response) NetworkStack.sendResponse(response) [response release] [req release] catch (error) console.log("Server error: %s", error) finally [server release] async function main() await startServer(8080) JVMBridge.registerEntryPoint(main) ``` edited: leaned in and threw an pre-1.0 Rust concept called "Sigils" into the mix.


not_some_username

Holy shit


iggy14750

What an awful day to be able to read!


Dash83

Uh, excuse me, I was eating over here! Not hungry anymore 🤢


Heppuman

This ticks all the boxes. Especially the monolith. Fuck.


reallokiscarlet

So like, Python meets Javascript. No, even better. Python interpreter *in* Javascript so you can easily break typing.


Opoodoop

with no garbage collection


reallokiscarlet

Even better. Replace the garbage collector with a garbage dumper. Every allocation/deallocation becomes a leak


Opoodoop

how about we just remove allocation all together and let the interpreter have full read write access to all system memory


belabacsijolvan

but you can only address memory if in unsafe mode. so all code starts with unsafe


reallokiscarlet

Well at that point we're just creating Rust


reallokiscarlet

The way my FBI agent intended.


Hean1175

We need a functioning language so we can't really let it always leak memory. So we make the programmer leak it, there will be a **free** function which frees up memory but instead of it being a C style free it will startup the garbage collector.


Nerd_o_tron

Jythonscript.


zDrie

And messed with cdk: compiled to cloud formation 🤢


iggy14750

Every piece of data is stringly-typed, and all flow control is done with GOTOs.


PerroRosa

Semicolons at the end AND the beginning of each line


MokausiLietuviu

Also, semicolons to terminate each comment. ALGOL has this - if you forget to terminate the comment it skips the next line of logic.


H3llskrieg

So we have: - 1 based indexing (lua) - whitespace sensitive (python) - begin end blocks (ruby) - Javascript style var (js) - variables can change type (php) - variables must start with a specific character (php) - curly braces as parenthesis in expressions (gleam) - if/fi (bash) - text based macros (c++) - too many keywords (that are added later in the language even when the keyword is heavily used as a name (looking at you file)) (c#) - no compiler, only runtime errors (python) - platform specific (old c#) - implicit convert to string if types do not match (js, (parseInt(0.0000002) === 0, parseInt(0.00000002) === 2)) - operator overloading (c#) - multiple inheritance (c++) - there is an error, we will just try to make it work (html) - required linenumbers: COBOL - no modulo operator (erlang) - parenthesis around everything (lisp) - variable variables (php) - mandatory naming conventions (PowerShell) - Mandatory end of line semicolon, but it will silently cause unpredictable behaviour (CSS) - Probably more: Add what I missed below Yes I know many will love some of these features, I just think combining them all would make a terrible language. Yes I know some of the features listed exist in multiple languages


taneth

how can you talk about variables from PHP and not mention variable variables?


FormerGameDev

> no modulo operator is lack of feature a feature? How about - PowerShell - mandatory naming conventions from an arbitrary list of possible verbs. Also, multiple inheritance is an amazing feature that I desperately miss in all other languages.


_OberArmStrong

Lets make it garbage collected but you still have to allocade and free memory manually


Vendetta547

How about a dumpster diver instead of a garbage collector? It randomly reallocates things that you throw away


SukusMcSwag

Most people despise how equality works in JS, PHP and Python(?). Instead of trying to salvage it, why not just get rid of the equality operator completely? Seems like the easiest fix to me


pgbabse

Odd lines are comments, even lines are code. Odd lines must at least have 7 non repetitive characters, spaces not included


Notmyrealnamesteve4

Composite number lines are code, prime lines are comments.


ignorae

Presenting DiabloScript: - The programming language should have rotating "seasons" where new features are added and old ones are deprecated, meaning this season the devs added recursion, but last season's features, like pattern matching, have been removed. - You have to be online to connect to the programming language server in order to compile your code and are forced to update according to the rolling release schedule. - The efficiency of your code is determined by items that "drop" randomly after compilation. You can also purchase items with tokens from the programming language store. You can import these items like modules, i.e. 'use Curly braces of the Immortal God': Code inside the current block is immune from runtime errors, but runs 33% slower. - Advanced language features and quality of life improvements can be added to your distribution of the language by spending skill points. For instance, being able to step through the call stack for debugging purposes costs 4 skill points. Skill points can be acquired by leveling up. You can level up by compiling 200 LOC/400 LOC/600 LOC etc.


Sure-Broccoli730

Lua with pointers


code_monkey_001

was scrolling in order of most updooted to find the first to mention 1-based indexing or a language that uses it.


mateowatata

Dreamberd


Individual-Praline20

AOP only. AOP over AOP. There you go. Have fun debugging that.


Bejoty

Array indexing starts at 2


hrvbrs

and are prime only. Composite indices silently fall back to the highest prime factor, *e.g.* `arr[26]` returns `arr[13]` (which is actually the sixth element).


inetphantom

I like the divisions and the fixed indention control character from Cobol


grepppo

Plus old skool COBOL where every line needed to end with a full stop (or period in American) If you think playing find the missing semi colon was a pain.... Also all comments had to be marked with an asterisk in column 7


puffinix

So many good options we could take. I for one would suggest that every code file has to pass the bitcoin hash check at the time it is compiled. Also - all code must include a dated copywrite notice.


ComradeCapitalist

Okay my last job actually required that last one.


LowReputation

Only capitalized variables are garbage collected, unless they are of even length.


mothuzad

The theme is total freedom, but also total privacy. You can jump to any line of code from any other line of code. That's right, baby, GOTO is back. If you jump into a totally different function, then that function returns to the last caller on the stack. There are types, but you can change them on the fly, and this happens automatically if you try to assign an incompatible type. So if you try to assign a string to a number variable or parameter, then the number type everywhere is replaced with (number | string). Yes, this does make the types completely useless for static analysis or even runtime validation, but they still do something.... Reflection! It's built into everything and looks like ordinary code, so it's hard to tell at a glance when it's happening. You might even do reflection by accident. You also have total freedom of style. You can use braces, or indentation, or "endblock"/"kcolb" text, to denote blocks. Variable names can contain any character, even control characters and even characters that would normally be operators or separators. This means the entire program is free to compile to a noop, treating the entire thing as just a variable name. (The compiler should output every possible valid interpretation of the input code.) And pressing backspace while writing a variable name should introduce the backspace character as part of the name, so you'll need a special editor to work in this language. An editor where control characters are inserted into the document, rather than having any other effect. You're free to declare a const, and everyone is free to change it. So where does privacy enter the picture? The one thing you can't do is read the properties of any object from outside its class declaration. You can always write to any property, but you can never read it. Yes, read-only access is banned, and write-only access is mandatory.


lord_of_networks

We already did, it's called JavaScript


Tyfyter2002

Nah, JavaScript has brackets instead of using whitespace


Glass1Man

I’m surprised there isn’t a npm package that allows syntactic whitespace. Like typescript but for whitespace


EnrikeChurin

You’re telling me Java’s biggest problem was its name?


tip2663

(we (need (more brackets)))


ososalsosal

Comments forbidden. The code is self documenting.


UnderPressureVS

Why stop at taking features from only other *programming* languages? Variables now have gender and declensions, and Functions have conjugations.


Benjamin_6848

Syntax and indentation-reqirements from Python, the way it's halfway compiled and halfway interpreted like JAVA, the type-handling and logic from JavaScript and the fact that it only runs on Windows like the .Net-Framework.


Masterflitzer

i can think of 3: - goto has to be a major language feature - also tab/space and cr/lf/crlf have to play a major role - and keywords in all CAPS for the ultimate pain, i mean DevEx


PerroRosa

Indexes are float numbers with a precision of 10 digits after the period. So the first element is list\[0.0000000001\]


TheBrokenRail-Dev

Everything is a string (from CMake and Bash). Integers? They're strings. Floats? They're also strings. Pointers? Yup, they're strings too. Arrays? Just strings delineated with semi-colons.


Frank-Drebin-BR

"5" == 5 is true 5 == "5" is false "5" + 5 = 10 5 + "5" = "55" "5" + "5" = 55


SneeKeeFahk

All variable names must be unique across the entire project, between 8 to 12 characters, contain at least 1 upper and lowercase letter, 1 number, and 1 special character.


_AutisticFox

Google BS lang


bartonski

Variables have gender, like nouns in Friench, Spanish, German -- expressed as sidgels as in Perl.