Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

6 Commits

Folders and files

NameName
Last commit message
Last commit date

Flurry

This is a Haskell implementation of the Flurry esoteric programming language. Flurry is a stack-based functional language with heavy inspiration from Brain-Flak.

Description

The main data type in Flurry is the expr. An expr is a function that takes a single input of type expr and produces an output of type expr. This function may modify the stack in the process (you can think of it as (expr, stack) -> (expr, stack) if you prefer).

The stack contains values of type expr. Attempting to pop from an empty stack will instead return the I combinator (λx. x).

The only syntactically relevant characters in a Flurry program are ()[]{}<>, and they must always be balanced. These expressions evaluate to an expr, and possibly modify the stack.

Here are the four nilads:

  • [] evaluates to the height of the stack as a Church numeral.
  • () evaluates to the K combinator (λxy. x).
  • <> evaluates to the S combinator (λxyz. xz(yz)).
  • {} pops the stack.

Here are the four monads:

  • [...] does nothing and evaluates to ... (acting as a grouping operator).
  • (...) pushes ... to the stack, and also returns it.
  • <abc> evaluates to a ○ b ○ c (where represents function composition).
  • {...} returns a function that evaluates ... with its argument on top of the stack (so {{}} is the identity function, for example).

Input and output are encoded as Church numerals on the stack. If any stack elements are not Church numerals, they are ignored.

Snippets

Duplicate the top stack value:

(({}))

Return the iota combinator (λx. xSK):

{{}<>()}

Return the sum of the top two stack values (assuming they are Church numerals):

{}[<><<>()>]{}

Return the product of the top two stack values (assuming they are Church numerals):

<{}{}>

Using the interpreter

You can compile the interpreter with

$ ghc -o target/Flurry -outputdir target src/*.hs

This will create a directory called target containing an executable called Flurry. You can run a program with:

$ echo "(<{}{}>)" > code.flr
$ target/Flurry -inn code.flr 10 20
200

You can also pass a program directly:

$ target/Flurry -inn -c "(<><<>()>({}))" 99
99 100

The first argument (-inn in this example) specifies IO behavior with 3 characters:

  • The first character describes what happens to the stack after the program is finished:
    • i means to output them as integer values.
    • b means to output them as byte values.
    • d means to output them as integer values to STDERR.
    • n means to ignore them.
  • The second character describes what happens to the return value of the program:
    • i means to output it as an integer value.
    • d means to output it as an integer value to STDERR.
    • n means to ignore it.
  • The third character describes how STDIN is used to initialize the stack:
    • i means the contents of STDIN are interpreted as integers.
    • b means the contents of STDIN are interpreted as their byte values.
    • n means the contents of STDIN is ignored.

The default IO configuration is -ini if the code was passed in a file, and -ddn if the code was passed with -c.

About

Brain-flak, but functional.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages