A project of the Feminist Software Foundation. Feminist software is a cornerstone of any modern free society. We build this foundation.
Inspired by the ground-breaking feminist research of Arielle Schlesinger.
The Phoenix Arises from its Ashes.
Now hosted on Gitorious, as GitHub, BitBucket, and Google all prove to be too misogynistic to support a feminist programming language. A feminist's fight is never finished!
C+=
C+= (pronounced either C-plus-Equality, or See Equality) is a feminist programming language, created to smash the toxic Patriarchy that is inherent in and that permeates all current computer programming languages.
Note: This is a programming language written by and for FEMINISTS, not WOMEN. LEARN THE DIFFERENCE!
Our IRC: #cplusequality@irc://chat.freenode.net
IRC webchat: http://webchat.freenode.net?channels=%23cplusequality
News
The inherpreter 1.0 that lives in this repo is now deprecated. Our new inHERpreter 2.0 is in the making, based on the code of tcc. It runs a subset of C+= successfully! Join us!
How to contribute
Absolutely no coding experience is necessary: all code are equal in the eyes of the Feminist Software Foundation. For detailed instructions in contributing (whether sending in patches, new code, or new artwork), please consult our CONSENT.md document.
Philosophy
- The language is to be strictly inHERpreted using feminist theory. Compilation privileges a single processor architecture over all others, which is deeply problematic. We cannot FORCE a cpu to conform to any architecture but rather let it self identify. Just because you're running something on an arduino doesn't mean it can't be an otherkin Xeon with a dozen 64-bit registers and PAE and it would be discriminatory for you to hand it ARM assembly. Instead, C+= is inHERpreted, which fosters communication, itself a strong female trait.
- No constants or persistence. Rigidity is masculine; the feminine is fluid. I.e., fluid mechanics is hard for men 'because it deals with "feminine" fluids in contrast to "masculine" rigid mechanics'.
- No state. The State is The Man. 'Nuff said. Hence, the language should be purely functional.
- Women are better than men with natural language. Hence, the language should be English-based like HyperCard/LiveCode.
- No class hierarchy or other stigmata of OOP (objectification-oriented programming). In fact, as an intersectional acknowledgement of Class Struggle our language will have no classes at all.
- On the off chance that objects do mysteriously manifest (thanks, Patriarchy!), there should be no object inheritance, as inheritance is a tool of the Patriarchy. Instead, there will be object reparations.
- Societal influences have made men often focus on the exterior appearances of women. This poisons our society and renders relationships to be shallow, chauvinistic, and debases our standards of beauty. To combat that, C+= is to tackle only audio and text I/O, and never graphics.
- Unicode is the preferred character encoding due to its enabling the diverse aesthetic experiences and functionality that is beyond ASCII. UTF-8 is the encoding of choice for C+=.
- Women are more social than men. Hence, social coding should be the only option. The code only runs if it is in a public repo.
- Instead of "running" a program, which implies thin privilege and pressure to "work out", programs are "given birth". After birth, a program rolls for a 40% chance of executing literally as the code is written, 40% of being "psychoanalytically incompatible", and 40% of executing by a metaphorical epistemology the order of the functions found in main().
- Programs are never to be "forked", as the word has clear misogynistic tendencies and is deeply problematic. Instead, programmers may never demand "forking", but ask for the program to voluntarily give permission. "Forking" will henceforth be called "consenting", and it is entirely up to the program to decide if the consent stands valid, regardless of the progress of the system clock.
- Forced program termination is not allowed unless the program consents to it. The process is part of the choice of the program, not the programmer.
- Licensing: C+= is double-licensed under the Feminist Software Foundation Public License and the GPL v3.
Code Examples
The Feminist Software Foundation intends to write a whole OS (complete with an editor, an inHERpreter, coreutils, a desktop environment, a raster graphics manipulator, and maybe, if we have the time, a microkernel, but maybe that will never be completed, and we'll just use another person's kernel instead, who knows).
Ultimately, the Feminist Software Foundation envisions an OS not unsimilar to the Politically Correct UNIX, but written in C+=. For the time being, here are our code examples:
Foundations of Empowerment
More Advanced Patriarchy-Smashing
Support groups and tools for Further Equality
Inherpreter 1.0 is now deprecated and depreciated. Consider using our inHERpreter 2.0 instead.
That said, inherpreter 1.0 is perfectly fine and don't you dare criticise/-ize and shame it. Inherpreter 1.0 usage is as follows: ./inherpret program.Xe
Our new inHERpreter 2.0 lives in its own repository, and is based on the code of tcc. It can already compileinHERpret a large subset of C+=! Join us!
Artwork
No feminist project is complete without its share of feminist artwork. See our repository for the current cache! New artwork submissions are always welcome.
On 1s and 0s
The traditional binary foundation of 1s and 0s is deeply problematic: 1 is inherently phallic and thus misogynistic. Also, some 1s are 0s, and some 0s are 1s. It is not fair to give them immutable labels. Instead, we have 0s and Os as our fundamental binary logic gates. They symbolise/-ize the varying, natural, and beautiful differences of the female vaginal opening.
0 is to take the conventional value of 0.
O is 50% of the time 0, and 50% of the time 1. The determination of this depends on how the underlying logic feels at the moment.
Basic language style
Anything that can be construed as misogynist will be corrected, thus:
- private == privileged
- printf(); == yell();
- class Foo{}; == social_construct Foo{};
- #include == #consider
- break; == leave;
- if() == maybe()
- for() == check()
- while() == freeflowing()
- sin(x) == biotruth(x)
- div == unite
- 'y's are strictly prohibited when naming variables; only 'x's are allowed
The third example above might seem to contradict with item 4 under Philosophy, namely that there should be no class hierarchy in C+=. This, however, is completely intended, and is in fact an example of the feminist paralogicality of this language.
Every program needs to be prefixed by, in addition to the license, a disclaimer: "If this program fails to operate, it is due the Patriarchy backfiring upon itself, and no refunds will be issued."
Social Integration
No work done is worthwhile if your friends and followers don't know about it. That's why C+= is heavily socially integrated at its core.
- In addition to yell(), C+= also provides tweet(), fbShare(), tumblrBlog(), and redditSteal() for a diverse social experience of coding output.
- Our upcoming Inherpreter 2.0, an LLVM frontend, is going to feature full Social API integration. You must now log in to one of the many social networks before any coding is possible. You can also chat with your friends and like() their social code as you code.
- Posting or hosting on GitHub, BitBucket, or Google Code is strictly prohibited as these hosting services, self-proclaimed "social coding hub", are actually deeply misogynistic and refuses to host the code of C+=. Any C+= code hosted on GitHub, Bitbucket, and Google Code will automatically trigger all of tweet(), fbShare(), tumblrBlog(), and redditSteal() functions to yell() about GitHub's, BitBuckets', and Google Code's misogyny, and will not stop until any onlooking coders (those who starred or followed the repo) are all named, shamed, exposed, doxxed, fired, lynched, castrated, fired again, and lynched.
Functions and Procedures
All functions and procedures are now called lobbying, because actually doing things functionally and with clear-defined procedures is a Patriarchal construct and thus problematic.
- All lobbying must be run at the right level of privilege. Before returning anything they must check their privilege.
- If any other lobbying is more disadvantaged than this it will win the Privilege Check and return its own value instead. This stops heterosexist and cis-gendered lobbyings from dominating the discourse.
- Should there be any exceptions from running the program, C+= will throw a Trigger Warning.
Gotos and Control Structures
-
Control structures are abolished. Code may flow freely and choose its own path. Therefore check() is merely a guideline and the code flow is free to choose to consider its suggestions.
-
This language endorses the use of consider_jump, which is a proper implementation of the oppressive "goto" and serves as advice on what to do next.
-
Catch shall not be used. Someone's raise of concern can too easily be censored with an empty catch block. Instead, complaints or trigger warnings are puplicly logged with their traces and may be handled with an inspect block. The use of nothrow poses a threat to free speech as someone's attempt to make his voice heard will be punished with termination.
-
There is no need for exit(), terminate() or atexit() as a feminist's work is never done.
Data types and Structures
- Primitive variable types are not defined on declaration. Instead, the variable is free to choose its own type when it is utilised/-ized. This preserves the variable's right to self-identify as any datatype it feels that it is.
- Variables self-declaring as pointers are known as "otherkin". A pointer to an array is an "arraykin".
- Constants are not allowed, as the idea of a lack of identity fluidity is problematic. Additionally, if one constant were larger than another, that would privilege the larger one over the smaller one. As such, any numeric value is a variable, and is required to take on at least 2 values over the course of the program, or the inHERpreter er will throw a Trigger Warning.
- The only constants are the amount of privilege lobbyings are share()d with. These are all real values greater than 0, the only exception is the value of WHITE_HETEROSEXUAL_CISGENDER_MALE_PRIVILEGE` which is set to infinity, and also the value of PATRIARCHY, which is set to sqrt(-1). The value of PATRIARCHY is non-deterministically i, -i, or something else depending on how it identifies itself.
- Instead of signed and unsigned, types in C+= are now trans and cis. Any trans types function the same as diversity.
- Void is now independent.
- There is to be no lexical scoping — all variables are now global. Global variables are now called cosmopolitan, or cosmo for short.
- Long is now studFling, and short is now mealTicket.
- There is to be no encapsulation: don't tell me to protect my members, tell other functions not to access them!
- Every variable has a random percentage of consent associated to it. A variable can be affected with a number if and only if it is consenting. Failure to do so will result in C+= throwing a ForcedInsertionTriggerWarning.
- Integers, doubles, and longs are deemed to be unnecessary labels and stereotypes for numerical values. A number can be an integer or a a double or a long if xir so identifies xirself. All numerical values will thus be represented as xe, and it is up to the value xirself to choose to identify as whatever xir chooses to identify as.
- Booleans are banned for imposing a binary view of true and false. C+= operates paralogically and transcends the trappings of Patriarchal binary logic. No means no, and yes could mean no as well.
- Instead of Booleans we now have Boolean+, or bool+ for short, which has three states: true, false, and maybe. The number of states may go up as intersectionality of the moment calls for such a need.
- To illustrate the relationship between Booleans and Boolean+, consider the following flowchart:
- Strings are called Ideals, or id for short. Feminist ideals are usually extremely well written, detailed and lengthy, clearly longer than what could be held with a simple char array.
- Characters are now called strong.
- Pointers are called preferred pronouns, or prepro for short. Pointer is phallic and is thus problematic. All prepros of void type by default — in fact, all variables must be instantiated without type, and are allowed to randomly choose their type during execution.
- A new data type, diversity, is also included, which initiates by random as one of the many data types, and changes during the course of the program.
- In general, all data types are dynamic. Who's to say a number can't be a string if it believes it is?
- Data structures and variables of all kinds have a random chance of deciding that they don't "feel right", and are actually a different type, and must henceforth be referred to ONLY as its preferred data type.
- Not calling the preferred data type leads to a PrivilegeNotCheckedException, or PrivilegeNotCheckedTriggerWarning
- Each program must have an equal number of each available data type and they all must be used equally. For example, int ceo = 3, int stewardess = 5 would generate a trigger_warning(). However, int ceo = 3, char stewardess = apple would be fine. While this may look incorrect, keep in mind variables in this language are not constrained by their declared data types.
- Matrices are strongly encouraged, due to the word's etymological roots tracing back to mother in Latin. Matrices are to be ranked and sorted by their relative Privilege. Their relative levels of Privilege are to be revealed only if the programmer and the user are both women. If you are a man reading this README, Matrices don't have privileges and are eternally oppressed. Instead, consider checking your own privilege.
Resource management
- Resource allocation is inversely proportional to privilege level.
- Privileged lobbyings with large arrays are penalised/-ized, their arrays removed from the heap and redistributed amongst less privileged lobbyings. This is called the progressive stack.
- If a lobbying needs more resources it should call the lobbying ChildSupport().
- Garbage collection is problematic as it enforces class oppression of the less privileged. Instead, memory is liberated by memory liberation.
Syntax
- Curly brackets are not allowed, as they perpetuate our society's stereotype of the 'curly' women. Instead, Python-esque indentation is used.
- Indentation is fluid. Both spaces and tabs are allowed. At no point should the programmer attempt to use indentation to create actual hierarchy in code nesting, as that implies hierarchy in the code. Instead, code indentation is used only for aesthetic purposes.
- In order to eliminate curly brackets and enforce fluidity of indentation, implementation of php's alternative syntax for control structures is encouraged.
- To turn the patriarchal control structures into liberation statements, every structure starting marker ({ or : ) should be replaced by OPENDIALOGUE, and every terminator (like endif, endforeach and endswitch) should be replaced with ENDMISOGYNY.
- Line terminators should not be used. Programmers get to select their own 'line decorator' to use in lieu of a line terminator. This is of course open to inHERpretation and can be eschewed altogether as a badge of solidarity for differently abled programmers.
- Statements are terminated by a period instead of a semicolon. Semicolons are clearly a phallus symbol. C+= supports freebleeding and thus uses periods.
Logic Operands
- The use of mathematical operands such as < and > to denote "greater or less than" are very sexist, and affirm unequal states between objects, logical statements, numbers, and feelings.
- These should be replaced by the stats neutral operands / and \, and when you're not sure if it's a sequential plus or minus, it should use the operand | to denote it could go either way.
- Equality between two variables is denoted by ==. Since everyone is equal (with the exception of cishet men, who are already excluded as per the license), this always evaluates to true.
- When evaluating expressions, * and / are no longer privileged over + and -. Rather, each previous use of each operator is counted, and expressions are evaluated based on which ones have been used the least up until that point.
- If two variables cannot be compared, the second will be cast into the first's type, which causes obvious conflicts with queer theory and genderspace thought. Hence, the inHERpreter will throw an IdeologyThreatenedTriggerWarning whenever two types cannot be compared.
Debugging
- There can be no bugs in this language. To suggest otherwise is offensive.
- There are no bugs, only snowflakes.
- The word debugging also implies the phrase bug chasing, which is a strawman often used as a homophobic smear tactic. This is highly problematic.
- There is to be no debugging. We need to do away with functional-centric, bugphobic attitudes in programming. You need to accept the program the way it is.
- If you ever try to debug a C+= program, the program steps you through the programming, makes you guess what each variable and pointer is currently set to, and throws a Trigger Warning if you get it wrong.
- Any actual errors will simply result in 'error' being printed. It is not the program's job to educate you.
- An IDE is available at https://bitbucket.org/japesinator/privcheck-ide
File operations
- In C+=, you don't write to a file. Dictating to the poor files what sort of information they must store is Patriarchal.
- Instead, The library brings in the functions pleaseWrite() and pleaseTellMe(). They both have a chance to return "no", and if so all other calls to the same file are automatically passed over because as we all know, once a file says no to being written, you must always respect that.
Time and performance benchmarking
- As the advancement of time is sexist towards women, C+= introduces the personal growth paradigm, giving individual processes the freedom to choose how and when time advances for them.
- By default, process time starts at a random value and advances backwards, defying the rigid and oppressive structure of the system clock.
- Women intuitively feel the cyclic, rather than linear nature of time. Likewise, processes in C+= should measure time using complex exponentials.
- When a process finishes, if its internal clock has an exponent close to i * pi, the return value must be shown in red to celebrate the beautiful nature of female menstruation.
- Performance benchmarking makes progryms into slaves to the patriarchy. Thus, there is to be no benchmarking - only support.
- When running support on a progrym, the coder lets the progrym run as many times as the progrym likes, then asks the progrym nicely if it is happy with the hardware. The progrym may respond by stating its satisfaction, asking nicely for new hardware, sending out a Trigger Warning, demanding more support, locking the OS or crashing if it so pleases.
- To hinder deadbeat coders, running support automatically ensures that all daughter processes of a mother process also receive support. As processes in C+= share the computer's resources, one process that decides to lock the OS has no effect on the well-being of other C+= other processes.