File Coverage

blib/lib/Lisp/Symbol.pm
Criterion Covered Total %
statement 22 44 50.0
branch 8 18 44.4
condition 4 6 66.6
subroutine 8 13 61.5
pod 0 11 0.0
total 42 92 45.6


line stmt bran cond sub pod time code
1             package Lisp::Symbol;
2 7     7   43 use strict;
  7         11  
  7         318  
3 7     7   81 use vars qw(@EXPORT_OK %obarray $VERSION);
  7         13  
  7         7095  
4              
5             $VERSION = sprintf("%d.%02d", q$Revision: 1.6 $ =~ /(\d+)\.(\d+)/);
6              
7             require Carp;
8             require Exporter;
9             *import = \&Exporter::import;
10             @EXPORT_OK = qw(symbol symbolp);
11              
12             #use overload '""' => \&name;
13              
14             %obarray = ();
15              
16             my $t = symbol("t");
17             $t->value($t);
18              
19             my $nil = symbol("nil");
20             $nil->value(undef);
21              
22             sub symbol
23             {
24 887     887 0 2135 Lisp::Symbol->new(@_);
25             }
26              
27             sub symbolp
28             {
29 1992     1992 0 8278 UNIVERSAL::isa($_[0], "Lisp::Symbol");
30             }
31              
32             sub new
33             {
34 887     887 0 1446 my($class, $name) = @_;
35 887 100       3210 return $obarray{$name} if $obarray{$name};
36 317         2576 $obarray{$name} = bless {'name' => $name}, $class;
37             }
38              
39             sub name
40             {
41 55     55 0 246 $_[0]->{'name'}; # readonly
42             }
43              
44             sub value
45             {
46 139     139 0 176 my $self = shift;
47 139 50 66     493 if (defined(wantarray) && !exists $self->{'value'}) {
48 0         0 Carp::croak("Symbol's value as variable is void ($self->{'name'})");
49             }
50 139         288 my $old = $self->{'value'};
51 139 100       400 $self->{'value'} = shift if @_;
52 139         407 $old;
53             }
54              
55             sub function
56             {
57 779     779 0 2783 my $self = shift;
58 779 50 66     2901 if (defined(wantarray) && !exists $self->{'function'}) {
59 0         0 Carp::croak("Symbol's value as function is void ($self->{'name'})");
60             }
61 779         1038 my $old = $self->{'function'};
62 779 100       1586 $self->{'function'} = shift if @_;
63 779         3935 $old;
64             }
65              
66             sub plist
67             {
68 0     0 0   my $self = shift;
69 0           my $old = $self->{'plist'};
70 0 0         $self->{'plist'} = shift if @_;
71 0           $old;
72             }
73              
74             sub get
75             {
76 0     0 0   my $self = shift;
77 0           $self->{'plist'}{$_[0]};
78             }
79              
80             sub put
81             {
82 0     0 0   my $self = shift;
83 0           $self->{'plist'}{$_[0]} = $_[1];
84             }
85              
86             sub dump_symbols
87             {
88 0     0 0   print join("", map $obarray{$_}->as_string, sort keys %obarray);
89             }
90              
91             sub as_string
92             {
93 0     0 0   my $self = shift;
94 0           require Lisp::Printer;
95 0           my @str;
96 0           push(@str, "$self->{'name'}\n");
97 0 0         if (exists $self->{'value'}) {
98 0           push(@str, "\tvalue: " .
99             Lisp::Printer::lisp_print($self->{'value'}) . "\n");
100             }
101 0 0         if (exists $self->{'function'}) {
102 0           push(@str, "\tfunction: " .
103             Lisp::Printer::lisp_print($self->{'function'}) . "\n");
104             }
105 0 0         if (exists $self->{'plist'}) {
106 0           push(@str, "\tplist: " .
107             Lisp::Printer::lisp_print($self->{'plist'}) . "\n");
108             }
109 0           join("", @str);
110             }
111              
112             1;