List

Inherits from Collection
Sealed

List — Ordered collection of elements.

Lists in Beamtalk are Erlang linked lists, created with #() syntax. Fast prepend (O(1)), sequential access. Use for stack-like and functional patterns.

BEAM Mapping

Beamtalk lists map directly to Erlang lists.

Examples

#(1, 2, 3) class         // => List
#(1, 2, 3) size          // => 3
#(1, 2, 3) first         // => 1
#(1, 2) ++ #(3, 4)       // => #(1, 2, 3, 4)

Class Methods

withAll: list source

Create a List from a list (identity — a list is already a List).

Used by the species pattern on Collection so that collect: and select: on a List return a List.

Examples

List class withAll: #(1, 2, 3)   // => #(1, 2, 3)
new: elements source

Create a List from a list. Convenience alias for withAll:.

Examples

List new: #(1, 2, 3)             // => #(1, 2, 3)

Instance Methods

size source

Number of elements in the list.

Examples

#(1, 2, 3) size          // => 3
#() size                 // => 0
isEmpty source

Test if the list has no elements.

Examples

#() isEmpty              // => true
#(1) isEmpty             // => false
first source

Return the first element.

Examples

#(1, 2, 3) first         // => 1
rest source

Return all elements except the first (the tail).

Examples

#(1, 2, 3) rest          // => #(2, 3)
last source

Return the last element.

Examples

#(1, 2, 3) last          // => 3
at: index source

Return the element at the given 1-based index.

O(n)List is a cons list. For frequent random access by position, use Array (aList asArray), whose at: is O(log n).

Examples

#(10, 20, 30) at: 2      // => 20
includes: item source

Test if the list contains the given item.

Examples

#(1, 2, 3) includes: 2   // => true
#(1, 2, 3) includes: 9   // => false
sort source

Sort the list in ascending order.

Examples

#(3, 1, 2) sort          // => #(1, 2, 3)
sort: comparator source

Sort the list using a custom comparator block.

Examples

#(3, 1, 2) sort: [:a :b | a > b]   // => #(3, 2, 1)
reversed source

Reverse the order of elements.

Examples

#(1, 2, 3) reversed      // => #(3, 2, 1)
unique source

Remove duplicate elements.

Examples

#(1, 2, 2, 3) unique     // => #(1, 2, 3)
detect: block source

Find the first element for which block returns true.

Examples

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

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

Examples

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

Iterate over each element, evaluating block with each one.

Examples

#(1, 2, 3) do: [:x | Transcript show: x]
asList source

A List is already a List — identity override of Collection>>asList that avoids rebuilding via the generic do:-fold.

collect: block source

Collect results of evaluating block on each element.

Examples

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

Select elements for which block returns true.

Examples

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

Reject elements for which block returns true.

Examples

#(1, 2, 3, 4) reject: [:x | x > 2]   // => #(1, 2)
inject: initial into: block source

Reduce the list with an accumulator. Evaluates block with accumulator and each element.

Examples

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

Return the first n elements.

Examples

#(1, 2, 3, 4) take: 2          // => #(1, 2)
drop: n source

Return all elements after the first n.

Examples

#(1, 2, 3, 4) drop: 2          // => #(3, 4)
flatten source

Flatten one level of nested lists.

Examples

#(#(1, 2), #(3, 4)) flatten    // => #(1, 2, 3, 4)
flatMap: block source

Map each element with block then flatten one level.

Examples

#(1, 2) flatMap: [:x | #(x, x * 10)]   // => #(1, 10, 2, 20)
count: block source

Count elements for which block returns true.

Examples

#(1, 2, 3, 4) count: [:x | x > 2]      // => 2
anySatisfy: block source

Test if any element satisfies block.

Examples

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

Test if all elements satisfy block.

Examples

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

Concatenate two lists.

Examples

#(1, 2) ++ #(3, 4)              // => #(1, 2, 3, 4)
printString source

Return a developer-readable string representation.

Examples

#(1, 2, 3) printString           // => "#(1, 2, 3)"
from: start to: end source

Return a subsequence from start to end (1-based, inclusive).

Examples

#(10, 20, 30, 40) from: 2 to: 3 // => #(20, 30)
indexOf: item source

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

Examples

#(10, 20, 30) indexOf: 20        // => 2
#(10, 20, 30) indexOf: 99        // => nil
zip: other source

Combine two lists element-wise into a list of pairs.

Examples

#(1, 2) zip: #("a", "b")        // => #(#(1, "a"), #(2, "b"))
groupBy: block source

Group elements by the result of block into a Dictionary.

Examples

#(1, 2, 3, 4) groupBy: [:x | x isEven]
partition: block source

Partition elements into a Dictionary with "matching" and "nonMatching" keys.

Examples

#(1, 2, 3, 4) partition: [:x | x isEven]
  // => Dictionary("matching" -> #(2, 4), "nonMatching" -> #(1, 3))
takeWhile: block source

Take elements from the front while block returns true.

Examples

#(1, 2, 3, 4) takeWhile: [:x | x < 3]    // => #(1, 2)
dropWhile: block source

Drop elements from the front while block returns true.

Examples

#(1, 2, 3, 4) dropWhile: [:x | x < 3]    // => #(3, 4)
intersperse: separator source

Insert separator between each pair of elements.

Examples

#(1, 2, 3) intersperse: 0        // => #(1, 0, 2, 0, 3)
addFirst: item source

Prepend an item to the front of the list in O(1) time (returns a new list).

Examples

#(2, 3) addFirst: 1              // => #(1, 2, 3)
#() addFirst: "x"               // => #("x")
add: item source

Append an item to the end of the list (returns a new list).

Examples

#(1, 2) add: 3                   // => #(1, 2, 3)
stream source

Return a lazy Stream over the list elements.

Examples

(#(1, 2, 3) stream) asList       // => #(1, 2, 3)
atRandom source

Return a random element from the list.

Examples

#(10, 20, 30) atRandom           // => one of 10, 20, 30
join source

Join a list of strings into a single string (no separator).

Examples

#("a", "b", "c") join            // => "abc"
#() join                         // => ""
join: separator source

Join a list of strings into a single string with a separator.

Examples

#("a", "b", "c") join: ", "      // => "a, b, c"
#("hello", "world") join: " "    // => "hello world"

Inherited Methods

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
noneSatisfy: block

Test if no element satisfies block.

Examples

#(1, 2, 3) noneSatisfy: [:x | x > 5]  // => true
#(1, 2, 3) noneSatisfy: [:x | x > 2]  // => false
count: block

Count the elements for which block returns true.

Examples

#(1, 2, 3, 4) count: [:x | x > 2]   // => 2
#() count: [:x | x > 2]             // => 0
sum

Sum all elements. Returns 0 for an empty collection.

Uses native numeric addition (intended for Integer/Float); it does not dispatch a Beamtalk + message. Kept as @primitive because the pure-BT fold performs arithmetic on the generic element type E, which the gradual type checker cannot prove is numeric.

Examples

#(1, 2, 3) sum               // => 6
#() sum                      // => 0
max

Return the largest element.

Compares using the runtime's native total ordering (intended for Integer/Float) — it does not dispatch a Beamtalk > message, so a custom > method on the element type is not honoured. Raises a #beamtalk_error on an empty collection — there is no maximum of nothing.

Examples

#(3, 1, 4, 1, 5) max         // => 5
min

Return the smallest element.

Compares using the runtime's native total ordering (intended for Integer/Float) — it does not dispatch a Beamtalk < message. Raises a #beamtalk_error on an empty collection.

Examples

#(3, 1, 4, 1, 5) min         // => 1
average

Return the mean of the elements as a Float.

Uses native numeric addition (intended for Integer/Float). Raises a #beamtalk_error on an empty collection.

Examples

#(1, 2, 3, 4) average        // => 2.5
eachWithIndex: block

Iterate over each element with its 1-based index.

Evaluates block with (element, index) for each element.

Examples

#("a", "b") eachWithIndex: [:item :i | Transcript show: i]
do: block separatedBy: separatorBlock

Iterate over each element, evaluating separatorBlock between elements.

The separator runs between consecutive elements, not before the first or after the last. Useful for joining/formatting.

Examples

#(1, 2, 3) do: [:x | Transcript show: x] separatedBy: [Transcript show: ", "]
asList

Convert to a List, in iteration order.

List is the canonical eager sequence. Note: for a Dictionary this yields its values (consistent with do:); for a Bag, each element is repeated by its occurrence count.

Examples

(1 to: 3) asList                          // => #(1, 2, 3)
(Set withAll: #(1, 2, 3)) asList sort     // => #(1, 2, 3)
asArray

Convert to an Array.

Examples

(1 to: 3) asArray         // => #[1, 2, 3]
asSet

Convert to a Set, discarding duplicates.

Examples

#(1, 2, 2, 3) asSet size  // => 3
asBag

Convert to a Bag, counting occurrences.

Examples

(#(1, 1, 2) asBag) occurrencesOf: 1   // => 2
asString

Return a string representation.

From Value

printString

Return a developer-readable string representation showing fields.

Produces ClassName(field: value, ...) via the canonical structural renderer (ADR 0094). Field values are rendered with their own printString (strings stay quoted, nested values show their structural form), in sorted field order. A class with no fields produces ClassName(). Recursion is bounded by depth/width/length caps with a cycle guard.

Examples

ValuePoint x: 3 y: 4        printString   // => "ValuePoint(x: 3, y: 4)"
ValuePoint new              printString   // => "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 the developer-readable (Debug) string representation.

printString is the Debug protocol (ADR 0094): the self-describing, structural form used by the REPL, logs, and by any other printString that nests this object. It is the REPL default — evaluating an expression shows its printString.

This default returns the bare class name (no a/an article — the old "a ClassName" form was dropped in ADR 0094). Value overrides it with the structural ClassName(field: value, ...) form, actors render as Actor(ClassName, pid), supervisors as Supervisor(ClassName, pid) / DynamicSupervisor(ClassName, pid), and primitive types (Integer, String, List, …) override it with their own richer output. Authors rarely override printString directly — the default is derived.

Examples

42 printString            // => "42"
displayString

Return the user-facing (Display) string representation.

displayString is the Display protocol (ADR 0094): the human-facing form. It is the hook the language pulls during string interpolation — every {...} segment renders via the value's displayString. Developers rarely call it directly; they override it when a value has a natural human rendering (e.g. Money$10.50, where printString would still show the Debug form).

It defaults to printString, so most types need no override. String and Symbol demonstrate the split: "hi" printString"\"hi\"" (quoted, Debug) while "hi" displayString"hi" (plain, Display); likewise #foo drops its # prefix under displayString.

displayString is not part of the Printable protocol (deferred per ADR 0094 §5).

Examples

42 displayString             // => "42"
inspect

Open a navigable Inspector cursor on the receiver.

ADR 0095 Phase 3 (BT-2504). inspect is repurposed from -> String (the ADR-0094 deferral) to the verb that produces an Inspector — a live, immutable cursor for drilling into the object (Inspector on: self). anObject inspect is the shorthand; Inspector on: anObject is the explicit spelling. The cursor exposes fields/at:/path/refresh/ printString (an indented text tree) and asDictionaries (the MCP/browser wire form); see Inspector.

This is a breaking change: code that used inspect for its old String result must switch to printString (the structural Debug string, ADR 0094) — a transitional lint flags inspect used directly in ++/ string position.

Examples

42 inspect kind                  // => #value
(Point x: 3 y: 4) inspect fields size   // => 2
(Point x: 3 y: 4) printString    // => "Point(x: 3, y: 4)"  (the old inspect string)
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.

For class-object receivers, follows Smalltalk semantics: self class is the metaclass, so the check walks the parallel metaclass hierarchy. The parallel chain is grounded at ProtoObject class superclass == Class (ADR 0036), so the metaclass tower merges into the instance-side Class → Behaviour → Object → ProtoObject chain. As a result, Integer isKindOf: Object and Integer isKindOf: Class both return true.

Examples

42 isKindOf: Integer        // => true
42 isKindOf: Object         // => true
#foo isKindOf: Symbol       // => true
#foo isKindOf: String       // => false
Integer isKindOf: Number    // => false (metaclass chain, not instance chain)
Integer isKindOf: Number class  // => true  (Number class is in the parallel chain)
Integer isKindOf: Object    // => true (grounded — Object is reachable via the metaclass tower)
Integer isKindOf: Class     // => true (Integer class inherits from Class)
error: message

Raise an error with the given message.

Examples

self error: "something went wrong"
delegate Sealed

Delegate message dispatch to the backing Erlang module (ADR 0101, BT-2720).

This method is a sentinel — a plain Object has no backing Erlang module, so calling delegate raises an Error at runtime. Stateless Objects declared with native: have their self delegate method bodies rewritten by the compiler's codegen phase to call the backing module directly, so the sentinel is never reached on a native: class.

Unlike Actor's delegate (visible only to Actor subclasses), this Object-base sentinel is visible to every class, so delegate is a reserved selector on the Object protocol.

Examples

42 delegate   // => ERROR: delegate called on a non-native Object

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