File: rosetta-abstract-type.tcl

package info (click to toggle)
nsf 2.3.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye
  • size: 12,628 kB
  • sloc: ansic: 32,245; tcl: 10,636; sh: 664; pascal: 176; lisp: 41; makefile: 24
file content (52 lines) | stat: -rw-r--r-- 1,261 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#
# == Rosetta Example: Abstract type 
#
# Define a class without instances and without implemented methods.
# For detailed description of this example 
# see https://rosettacode.org/wiki/Abstract_type
#
package req nx
package req nx::test

#
# Define a class AbstractQueue
nx::Class create AbstractQueue {
  
  :public method enqueue {item} {error "not implemented"}
  :public method dequeue {} {error "not implemented"}
 
  :public object method create {args} {
    error "Cannot instantiate abstract class [self]"
  }
}

#
# Define a concrete queue (named ListQueue) based 
# on the Abstract Queue
nx::Class create ListQueue -superclass AbstractQueue {
    
  :variable list {}
    
  :public method enqueue {item} {
    lappend :list $item
  }
  
  :public method dequeue {} {
    set item [lindex ${:list} 0]
    set :list [lrange ${:list} 1 end]
    return $item
  }
}

# === Demonstrating the behavior in a shell: 
#
# Trying to create an instance of the AbstraceQueue returns an error message:
? {AbstractQueue new} {Cannot instantiate abstract class ::AbstractQueue}

# Create an instance of the concrete queue:
? {set q [ListQueue new]} "::nsf::__#1"

# Enqueue and dequeue items
? {$q enqueue 100} 100
? {$q enqueue 101} "100 101"
? {$q dequeue} 100