String

Inherits from Binary
Sealed

String — UTF-8 text operations.

Strings in Beamtalk are UTF-8 encoded binaries (Erlang binaries). All string operations are grapheme-aware.

BEAM Mapping

Beamtalk strings map directly to Erlang binaries.

Examples

"hello" class         // => String
"hello" length        // => 5
"hello" ++ " world"   // => "hello world"

Class Methods

withAll: list source

Create a String by joining a list of grapheme cluster strings.

Useful for constructing a String from the result of asList or select: operations. Each element should be a grapheme string.

Examples

String class withAll: #("h", "e", "l", "l", "o")  // => "hello"
fromCodePoint: codePoint source

Create a single-character String from a Unicode code point integer.

Examples

String fromCodePoint: 65    // => "A"
String fromCodePoint: 8364  // => "€"
fromCodePoints: list source

Create a String from a list of Unicode code point integers.

Examples

String fromCodePoints: #(72, 105)   // => "Hi"
String fromCodePoints: #(123, 125)  // => "\{\}"
fromIolist: iolist source

Convert an Erlang iolist or charlist to a String binary.

Useful for coercing the result of Erlang FFI calls that return iolists (nested lists of binaries and integers) into a plain String.

Examples

String fromIolist: #(104, 105)   // => "hi"

Instance Methods

=:= other source

Test strict equality with another string.

Examples

"abc" =:= "abc"      // => true
"abc" =:= "xyz"      // => false
=/= other source

Test strict inequality with another string.

Examples

"abc" =/= "xyz"      // => true
"abc" =/= "abc"      // => false
/= other source

Test inequality with another string.

Examples

"abc" /= "xyz"     // => true
"abc" /= "abc"     // => false
< other source

Test if the receiver sorts before another string.

Examples

"abc" < "xyz"      // => true
"xyz" < "abc"      // => false
> other source

Test if the receiver sorts after another string.

Examples

"xyz" > "abc"      // => true
"abc" > "xyz"      // => false
<= other source

Test if the receiver sorts before or equal to another string.

Examples

"abc" <= "xyz"     // => true
"abc" <= "abc"     // => true
>= other source

Test if the receiver sorts after or equal to another string.

Examples

"xyz" >= "abc"     // => true
"abc" >= "abc"     // => true
++ other source

Concatenate the receiver with another string.

Examples

"hello" ++ " world"  // => "hello world"
"a" ++ "b"           // => "ab"
, other source

Concatenate the receiver with another string (Smalltalk-style comma operator).

Equivalent to ++. Provided for Smalltalk compatibility.

Examples

"foo" , "bar"   // => "foobar"
"hello" , " world"  // => "hello world"
length source

Number of grapheme clusters in the string.

Examples

"hello" length       // => 5
"" length            // => 0
size source

Alias for length.

Examples

"hello" size         // => 5
at: index source

Return the grapheme cluster at the given 1-based index.

Examples

"hello" at: 1        // => "h"
"hello" at: 5        // => "o"
uppercase source

Convert all characters to uppercase.

Examples

"hello" uppercase    // => "HELLO"
lowercase source

Convert all characters to lowercase.

Examples

"HELLO" lowercase    // => "hello"
capitalize source

Capitalize the first character.

Examples

"hello" capitalize   // => "Hello"
trim source

Remove leading and trailing whitespace.

Examples

"  hello  " trim     // => "hello"
trimLeft source

Remove leading whitespace.

Examples

"  hello" trimLeft   // => "hello"
trimRight source

Remove trailing whitespace.

Examples

"hello  " trimRight  // => "hello"
reverse source

Reverse the string (grapheme-aware).

Examples

"hello" reverse      // => "olleh"
includesSubstring: substring source

Test if the receiver contains a substring.

Examples

"hello world" includesSubstring: "world"  // => true
"hello" includesSubstring: "xyz"          // => false
startsWith: prefix source

Test if the receiver starts with the given prefix.

Examples

"hello" startsWith: "hel"   // => true
"hello" startsWith: "xyz"   // => false
endsWith: suffix source

Test if the receiver ends with the given suffix.

Examples

"hello" endsWith: "llo"     // => true
"hello" endsWith: "xyz"     // => false
indexOf: substring source

Return the 1-based index of the first occurrence of a substring, or nil if not found.

Examples

"hello" indexOf: "ell"      // => 2
"hello" indexOf: "xyz"      // => nil
split: separator source

Split the string by a separator.

Examples

"a,b,c" split: ","          // => #("a", "b", "c")
splitOn: pattern source

Split the string by a pattern.

Examples

"a::b::c" splitOn: "::"     // => #("a", "b", "c")
repeat: n source

Repeat the string n times.

Examples

"ab" repeat: 3              // => "ababab"
lines source

Split the string into lines.

Examples

"a\nb\nc" lines             // => #("a", "b", "c")
words source

Split the string into words (whitespace-separated).

Examples

"hello world" words         // => #("hello", "world")
replaceAll: old with: new source

Replace all occurrences of old with new.

Examples

"aabaa" replaceAll: "a" with: "x"     // => "xxbxx"
replaceFirst: old with: new source

Replace the first occurrence of old with new.

Examples

"aabaa" replaceFirst: "a" with: "x"   // => "xabaa"
take: n source

Take the first n grapheme clusters.

Examples

"hello" take: 3             // => "hel"
drop: n source

Drop the first n grapheme clusters.

Examples

"hello" drop: 2             // => "llo"
padLeft: width source

Left-pad the string to the given width with spaces.

Examples

"hi" padLeft: 5             // => "   hi"
padRight: width source

Right-pad the string to the given width with spaces.

Examples

"hi" padRight: 5            // => "hi   "
padLeft: width with: char source

Left-pad the string to the given width with the specified character.

Examples

"hi" padLeft: 5 with: "0"  // => "000hi"
padRight: width with: char source

Right-pad the string to the given width with the specified character.

Examples

"hi" padRight: 5 with: "0"  // => "hi000"
isEmpty source

Test if the string is empty.

Examples

"" isEmpty                  // => true
"hello" isEmpty             // => false
isNotEmpty source

Test if the string is not empty.

Examples

"hello" isNotEmpty          // => true
"" isNotEmpty               // => false
isBlank source

Test if the string is empty or contains only whitespace.

Examples

"   " isBlank               // => true
"" isBlank                  // => true
isDigit source

Test if all characters are digits.

Examples

"123" isDigit               // => true
"12a" isDigit               // => false
isAlpha source

Test if all characters are letters.

Examples

"abc" isAlpha               // => true
"ab1" isAlpha               // => false
asInteger source

Parse the string as an integer.

Examples

"42" asInteger              // => 42
asFloat source

Parse the string as a float.

Examples

"3.14" asFloat              // => 3.14
asAtom source

Convert the string to an atom (Symbol).

Examples

"hello" asAtom              // => #hello
asList source

Convert the string to a list of grapheme cluster strings.

Examples

"abc" asList                // => #("a", "b", "c")
do: block source

Iterate over each grapheme cluster, evaluating block with each one.

Examples

"abc" do: [:c | Transcript show: c]
collect: block source

Collect results of evaluating block on each grapheme cluster.

Returns a String built by concatenating the block results.

Examples

"abc" collect: [:c | c uppercase]  // => "ABC"
select: block source

Select grapheme clusters for which block returns true.

Returns a String of the matching grapheme clusters (filtered graphemes remain valid graphemes).

Examples

"a1b2" select: [:c | c isAlpha]    // => "ab"
reject: block source

Reject grapheme clusters for which block returns true.

Returns a String of the grapheme clusters that were not rejected.

Examples

"a1b2" reject: [:c | c isAlpha]    // => "12"
stream source

Return a lazy Stream over the characters (grapheme clusters).

Examples

("hello" stream) take: 3         // => #("h", "e", "l")
matchesRegex: pattern source

Test if the string matches a regular expression pattern. Accepts a String pattern or compiled Regex object.

Examples

"hello123" matchesRegex: "[0-9]+"          // => true
"hello" matchesRegex: "^[0-9]+$"           // => false
matchesRegex: pattern options: opts source

Test if the string matches a pattern with PCRE options.

Examples

"Hello" matchesRegex: "[a-z]+" options: #(#caseless)  // => true
firstMatch: pattern source

Find the first regex match, returning matched String or nil.

Examples

"hello123world" firstMatch: "[0-9]+"       // => "123"
"hello" firstMatch: "[0-9]+"               // => nil
allMatches: pattern source

Find all regex matches, returning a List of Strings.

Examples

"a1b2c3" allMatches: "[0-9]+"              // => #("1", "2", "3")
replaceRegex: pattern with: replacement source

Replace the first regex match with a replacement string.

Examples

"hello world" replaceRegex: "[aeiou]" with: "*"      // => "h*llo world"
replaceAllRegex: pattern with: replacement source

Replace all regex matches with a replacement string.

Examples

"hello world" replaceAllRegex: "[aeiou]" with: "*"   // => "h*ll* w*rld"
splitRegex: pattern source

Split the string by a regex pattern.

Examples

"a,,b,,,c" splitRegex: ",+"                // => #("a", "b", "c")
printString source

Return a developer-readable string representation (with surrounding quotes). Embedded double-quote characters are doubled (Beamtalk string literal convention).

Examples

"hello" printString         // => """hello"""
inspect source

Override inspect to use printString rather than the field-based format defined in Value. Strings are primitives, not map-based value objects.

asString source

Return the string itself (identity conversion).

Examples

"hello" asString             // => "hello"
displayString source

Return the string itself for user-facing display (no surrounding quotes).

Examples

"hello" displayString       // => "hello"

Inherited Methods

From Binary

size

Return the byte count of this binary.

Examples

(Binary serialize: 42) size   // => _
do: block

Iterate over each byte (Integer 0-255), evaluating block with each one.

Examples

(Binary fromBytes: #(104, 101)) do: [:b | Transcript show: b]
printString

Return a developer-readable string representation.

Displays hex representation for non-UTF-8 binaries, or quoted string for valid UTF-8 binaries.

Examples

(Binary fromBytes: #(104, 101)) printString   // => _
at: index

Return the byte value (0-255) at the given 1-based index.

Raises index_out_of_bounds if the index is out of range.

Examples

(Binary fromBytes: #(104, 101, 108)) at: 1   // => 104
byteAt: offset

Return the byte value (0-255) at the given 0-based offset.

Uses 0-based indexing to match Erlang's binary:at/2. Raises index_out_of_bounds if the offset is out of range.

Examples

(Binary fromBytes: #(104, 101, 108)) byteAt: 0   // => 104
byteSize

Return the byte count of this binary.

Alias for size on Binary. On String, provides unambiguous byte count (since String overrides size with grapheme count).

Examples

(Binary fromBytes: #(104, 101, 108)) byteSize   // => 3
part: offset size: length

Return a zero-copy slice of this binary.

Takes a 0-based offset and length. Raises index_out_of_bounds if the range is invalid.

Examples

(Binary fromBytes: #(1, 2, 3, 4, 5)) part: 1 size: 3   // => _
concat: other

Concatenate this binary with another binary.

Examples

(Binary fromBytes: #(1, 2)) concat: (Binary fromBytes: #(3, 4))   // => _
toBytes

Convert this binary to a list of byte integers (0-255).

Examples

(Binary fromBytes: #(104, 101)) toBytes   // => #(104, 101)
asString

Validate UTF-8 and return the binary as a String.

Returns a Result: success gives a String, failure gives an error with the byte offset of the invalid sequence.

Examples

(Binary fromBytes: #(104, 101, 108, 108, 111)) asString   // => _
asStringUnchecked

Return this binary as a String without UTF-8 validation.

Use when you trust the source data is valid UTF-8.

Examples

(Binary fromBytes: #(104, 101, 108, 108, 111)) asStringUnchecked   // => "hello"

From Collection

size

Return the number of elements.

do: _block

Iterate over each element, evaluating block with each one.

printString

Return a developer-readable string representation.

species

Return the class used to build results from collection operations.

Used by collect:, select:, and reject: to return the same collection type as the receiver. Sealed subclasses override this.

Examples

#(1, 2) species         // => List
#[1, 2] species         // => Array
isEmpty

Test if the collection has no elements.

Examples

#() isEmpty                  // => true
#(1) isEmpty                 // => false
isNotEmpty

Test if the collection has at least one element.

Examples

#(1) isNotEmpty              // => true
#() isNotEmpty               // => false
includes: element

Test if the collection contains the given element.

Default implementation iterates with do: and returns early on match. Subclasses may override with more efficient lookup.

Examples

#(1, 2, 3) includes: 2      // => true
#(1, 2, 3) includes: 9      // => false
inject: initial into: block

Reduce the collection with an accumulator.

Evaluates block with (accumulator, element) for each element. Returns the final accumulator value.

Kept as @primitive because the pure-BT implementation using do: with local-variable mutation does not work for abstract-class methods: the compiler generates lists:foreach (no state threading) instead of lists:foldl. The Erlang helper calls the block as Block(Acc, Elem) (accumulator first) to match the Beamtalk block value: acc value: each convention expected by collect:, select:, and reject:.

Examples

#(1, 2, 3) inject: 0 into: [:sum :x | sum + x]  // => 6
collect: block

Collect results of evaluating block on each element.

Returns a collection of the same type as the receiver (species pattern). Builds the result in reverse using addFirst: then converts via species withAll:.

Examples

#(1, 2, 3) collect: [:x | x * 2]  // => #(2, 4, 6)
select: block

Select elements for which block returns true.

Returns a collection of the same type as the receiver (species pattern). Builds the result in reverse using addFirst: then converts via species withAll:.

Examples

#(1, 2, 3, 4) select: [:x | x > 2]  // => #(3, 4)
reject: block

Reject elements for which block returns true.

Examples

#(1, 2, 3, 4) reject: [:x | x > 2]  // => #(1, 2)
detect: block

Find the first element for which block returns true.

Returns nil if no element matches. Uses ^ (non-local return) for early exit — this compiles to throw/catch on BEAM.

Examples

#(1, 2, 3) detect: [:x | x > 1]     // => 2
detect: block ifNone: noneBlock

Find the first element matching block, or evaluate noneBlock if none.

Uses ^ (non-local return) for early exit — compiles to throw/catch on BEAM.

Examples

#(1, 2) detect: [:x | x > 5] ifNone: [0]  // => 0
anySatisfy: block

Test if any element satisfies block.

Uses ^ (non-local return) for early exit — compiles to throw/catch on BEAM.

Examples

#(1, 2, 3) anySatisfy: [:x | x > 2]  // => true
allSatisfy: block

Test if all elements satisfy block.

Uses ^ (non-local return) for early exit — compiles to throw/catch on BEAM.

Examples

#(2, 4, 6) allSatisfy: [:x | x isEven]  // => true
asString

Return a string representation.

From Value

inspect

Return a developer-readable string representation showing fields.

Produces ClassName(field: value, ...). Field values are recursively inspected — strings are quoted, nested objects show their own inspect. A class with no fields produces ClassName().

Examples

ValuePoint x: 3 y: 4        inspect   // => "ValuePoint(x: 3, y: 4)"
ValuePoint new              inspect   // => "ValuePoint(x: 0, y: 0)"

From Object

class

Return the class of the receiver.

Examples

42 class              // => Integer
"hello" class         // => String
isNil

Test if the receiver is nil. Returns false for all objects except nil.

Examples

42 isNil              // => false
nil isNil             // => true
notNil

Test if the receiver is not nil. Returns true for all objects except nil.

Examples

42 notNil             // => true
nil notNil            // => false
ifNil: _nilBlock

If the receiver is nil, evaluate nilBlock. Otherwise return self.

Examples

42 ifNil: [0]         // => 42
nil ifNil: [0]        // => 0
ifNotNil: notNilBlock

If the receiver is not nil, evaluate notNilBlock with self.

Examples

42 ifNotNil: [:v | v + 1]   // => 43
nil ifNotNil: [:v | v + 1]  // => nil
ifNil: _nilBlock ifNotNil: notNilBlock

If nil, evaluate nilBlock; otherwise evaluate notNilBlock with self.

Examples

42 ifNil: [0] ifNotNil: [:v | v + 1]    // => 43
nil ifNil: [0] ifNotNil: [:v | v + 1]   // => 0
ifNotNil: notNilBlock ifNil: _nilBlock

If not nil, evaluate notNilBlock with self; otherwise evaluate nilBlock.

Examples

42 ifNotNil: [:v | v + 1] ifNil: [0]    // => 43
nil ifNotNil: [:v | v + 1] ifNil: [0]   // => 0
printString

Return a developer-readable string representation.

Default implementation returns "a ClassName". Subclasses such as Integer, String, and List override this to return richer output.

Examples

42 printString            // => "42"
displayString

Return a user-facing string representation for display purposes.

Default implementation delegates to printString. Subclasses such as String and Symbol override this to return a more readable form without developer annotations (e.g. no surrounding quotes or # prefix).

Examples

42 displayString             // => "42"
inspect

Inspect the receiver.

Examples

42 inspect             // => "42"
yourself Sealed

Return the receiver itself. Useful for cascading side effects.

Examples

42 yourself            // => 42
hash

Return a hash value for the receiver.

Examples

42 hash
respondsTo: selector Sealed

Test if the receiver responds to the given selector.

Examples

42 respondsTo: #abs    // => true
fieldNames Sealed

Return the names of fields.

Examples

42 fieldNames             // => #()
fieldAt: name Sealed

Return the value of the named field.

Examples

object fieldAt: #name
fieldAt: name put: value Sealed

Set the value of the named field (returns new state).

Examples

object fieldAt: #name put: "Alice"
perform: selector Sealed

Send a unary message dynamically.

Examples

42 perform: #abs       // => 42
perform: selector withArguments: args Sealed

Send a message dynamically with arguments.

Examples

3 perform: #max: withArguments: #(5)   // => 5
subclassResponsibility

Raise an error indicating this method must be overridden by a subclass.

Examples

self subclassResponsibility
notImplemented

Raise an error indicating this method has not yet been implemented.

Use this for work-in-progress stubs. Distinct from subclassResponsibility, which signals an interface contract violation.

Examples

self notImplemented
show: aValue

Send aValue to the current transcript without a trailing newline.

Nil-safe: does nothing when no transcript is set (batch compile, tests).

Examples

42 show: "value: "
showCr: aValue

Send aValue to the current transcript followed by a newline.

Nil-safe: does nothing when no transcript is set (batch compile, tests).

Examples

42 showCr: "hello world"
isKindOf: aClass

Test if the receiver is an instance of aClass or any of its subclasses.

Examples

42 isKindOf: Integer    // => true
42 isKindOf: Object     // => true
#foo isKindOf: Symbol   // => true
#foo isKindOf: String   // => false
error: message

Raise an error with the given message.

Examples

self error: "something went wrong"

From ProtoObject

== other

Test value equality (Erlang ==).

Examples

42 == 42           // => true
"abc" == "abc"     // => true
/= other

Test value inequality (negation of ==).

Examples

1 /= 2             // => true
42 /= 42           // => false
class

Return the class of the receiver.

Examples

42 class            // => Integer
"hello" class       // => String
doesNotUnderstand: selector args: arguments

Handle messages the receiver does not understand. Override for custom dispatch.

Examples

42 unknownMessage   // => ERROR: does_not_understand
perform: selector withArguments: arguments

Send a message dynamically with an arguments list.

Examples

42 perform: #abs withArguments: #()   // => 42
performLocally: selector withArguments: arguments

Execute a class method in the caller's process, bypassing gen_server dispatch.

The caller takes responsibility for knowing the method does not mutate class state. Useful for long-running class methods that would otherwise block the class object's gen_server.

Limitations: only resolves methods defined directly on the target class module (does not walk the superclass chain). Class variables and self are not available to the method (nil and #{} are passed).

Examples

MyClass performLocally: #run:ctx: withArguments: #(input, ctx)
perform: selector withArguments: arguments timeout: timeoutMs

Send a message dynamically with an arguments list and explicit timeout.

The timeout (in milliseconds or #infinity) applies to the gen_server:call when the receiver is an actor. For value types, timeout is ignored.

Examples

actor perform: #query withArguments: #(sql) timeout: 30000