1
0
Fork 0
forked from fun/fun

Initial commit.

This commit is contained in:
Johannes Findeisen 2025-09-11 02:07:59 +02:00
commit f45975f523
4 changed files with 219 additions and 0 deletions

0
.gitignore vendored Normal file
View file

13
LICENSE Normal file
View file

@ -0,0 +1,13 @@
Copyright 2025 Johannes Findeisen
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

60
README.md Normal file
View file

@ -0,0 +1,60 @@
# Fun
Fun Uses Nothing - The programming language for having fun.
Influenced by C, Go, Lua, Python and Rust.
## Idea
* Simplicity
* Consistency
* Joy in coding
* Fun!
## Characteristics
* Dynamic
* No pointers
* Type safety
* Written in C / Internally no_camel_case... ;)
## The Fun Manifesto
Fun is a programming language built on a simple idea:
Coding should be enjoyable, elegant, and consistent.
### Philosophy
- **Fun is Fun**
Programming should spark creativity, not frustration. Code in Fun feels light, playful, and rewarding.
- **Fun Uses Nothing**
Minimalism is power. No unnecessary features, no endless syntax variations, no formatting debates. Just clean, uniform code.
- **Indentation is Truth**
Two spaces, always. No tabs, no four-space wars. Code should look the same everywhere, from your laptop to /usr/bin/fun.
- **One Way to Do It**
No clutter, no 15 ways of writing the same thing. Simplicity means clarity.
- **Hackable by Nature**
Fun should be small and embeddable, like Lua. Easy to understand, extend, and tinker with — true to the hacker spirit.
- **Beautiful Defaults**
A language that doesnt need linters, formatters, or style guides. Beauty is built in.
### The Community
Fun is not about being the fastest or the most feature-rich. Its about sharing joy in coding. The community should be:
- Respectful
- Curious
- Creative
Like the name says: Fun Unites Nerds.
### The Goal
A language that feels like home for developers who:
- Love minimal, elegant tools
- Believe consistency is freedom
- Want to write code that looks good and feels good
Fun may not change the world — but it will make programming a little more fun.

146
draft.fun Normal file
View file

@ -0,0 +1,146 @@
// For scripting fun should be callable by a standard shebang line.
#!/usr/bin/env fun
/*
This file is the creative are of an idea. Here will be fun defined before any
implementation or programming. Just a compiled version of many ideas... ;)
Copyright 2025 Johannes Findeisen <you@hanez.org>
License: Apache License, Version 2.0
Birthdate: 2025-09-10
*/
// This line MUST work as a comment.
// This is a comment! /* in combination with */ are a multiline comments.
/*
- No ";" for line termination. New commands must be processed in a new line,
not like in bash where you can do df; df; But you can do df; df;. :)
- Something like printf and date formatation must exist.
- Can be used inside ''; Like echo 'x "y" z'. ' has higher priority.
- Intendation would be nice if would be fixed on 2 whitespaces. No tabs!
- Internals like range() must not be redefined!
- Functions and variables can not have the same name! If a function with name
foo() exists, you can not asign a avlue to foo = value.
- Strings must be initialized with the type they are and can not be missused.
If a string is 1 you need to cast it to num to become a new type.
- Strings are always qouted wit "" but can be qouted with '' too, but then you
can use "" inside the string. ' can be used in the string too, but it than
must be escaped with \.
- Not Git based includes like in Go! No way! All dependencies MUST be managed
inside the fun projects code base.
- Global variables can not be redefined somwhere in the code. So defining a
variable in a function that exist globally would overwrite the memory of the
global variable. Local variables SHOULD be prefixed with _ or some other
prefix and named to be unique. If you have a global variable i in a file you
can not use i in that file anymore. If you try to define a global variable
in your code, that is defined already in a library as a global var,
execution will fail. So, keep the use of globals vars very very limited!
*/
// Includes from a system installed file. Included libs should support the
// extension .so and the .fun extension for core libraries implemented in fun,
// but can be included without the extension. This directory must support
// subdirectories. The root for this diretory is e.g. /var/lib/fun/.
// Some examples:
#include crypt/md5
#include crypt/sha256
#include date
#include math
// Files can be included with or without the extension.
#include native/lib.fun
#include native/std.so
#include network
#include process
#include socket
#include thread
#include time
// Includes from current working directory. The prefixed / makes the difference.
// Files here are written in fun and have the .fun extension, but can be
// included with or without the extension. This directory must support
// subdirectories.
#include some_fun_file
#include includes/some_include_file.fun
// But it should be possible for .fun like system includes. Files here are
// written in fun and have the .fun extension, but can be included without the
// extension. This directory must support subdirectories.
#include /home/hanez/fun/file.fun
// Keywords (e.g., if, for, while, f)
// Operators (+, -, *, /, =, ==)
// Comparisons (==, !=, >, <)
// Variable names can contain chars and numbers from a_z, A_Z and 0_9, but can
// not start with a number.
// Boolean variables should be true/false and 1/0
boolean funny = true
// fun has a byte variable where raw bytes can bes stored.
byte mario = 0x23
// Strings need '.
byte luigi = "Jehaa!"
// Numbers don't use ' here.
byte todd = 42
float new_float = 0.12345
// Global variables can be used everywhere in the code. Even in in cluded files.
global string a_string = 'Hello'
global string b_string = 'World!'
string x_string = a_string + " " + b_string
string y_string = a_string + ' ' + b_string
string z_string = a_string + '" "' + b_string
// 64 bit number
number foo = 23
// Private variables can only be used here in this file.
private number bar = 42
for i in range(1, 1000) {
echo i
echo add(i, 1)
}
for i in range(1, foo) {
echo "i"
}
// This must not work since range() is an internal function.
string range = "f987458n73v03258"
if(x != y)
echo x
else if(a == b || h != i)
echo [a + b + h + i]
else
if(k < 1 && l > 1)
echo "Buh!"
fi
fi
// Internal functions.
add(a, b)
return [a + b]
sub(a, b)
return [a - b]
// a can be "df -h", "df -h; df -h" or "cat /etc/resolv.conf | grep nameserver".
system(a)
// Execute a system command here and then return the return code.
return [a]
// Some kind of cast function for converting data types.
cast(a)
return CASTED_string_to_another_existing_type(a)
// External functions need f as a prefix to define the function.
f get_string(a_string, b_string)
return a_string + " " + b_string
eof