split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv
, '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

split a string basic type away from symbolBase - #203

Merged
perrydv merged 1 commit into
mainfrom
rearrange-string-type
Jun 9, 2026
Merged

split a string basic type away from symbolBase#203
perrydv merged 1 commit into
mainfrom
rearrange-string-type

Conversation

@perrydv

Copy link
Copy Markdown
Contributor

Support for strings is still rudimentary. In issue #201 we saw that even returning a string triggered a warning because the type checking for return objects was based on the basic types of double, integer, and logical. However the string type also hijacked the same symbol type, resulting in an error in the Return error checking. Strings are a somewhat hybrid case because there is some commonality, especially if we can use Eigen Tensors to store and access non-scalars for strings and possible other kinds of elements. So this PR takes the approach of inserting a layer into the symbol class hierarchy. The new layer serves as a base class for any core type that might be scalar or not. Then symbolBasic (for double, integer, and logical, and also AD) derives from that, and a new symbolBasicString also derives from that. It meant that all code checking on or working with the symbolBasic type was not broken.

In addition I separated void into its own symbol class rather than also hijacking a special case of symbolBasic for this.

Tests passed, so this looks good to go.

Fixes#201

@perrydv
perrydv merged commit d0ba862 into mainJun 9, 2026
5 checks passed
@perrydv
perrydv deleted the rearrange-string-type branch June 9, 2026 02:11
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

warning when returning a 'string'

1 participant

@perrydv