-
Notifications
You must be signed in to change notification settings - Fork 1
/
cap-test.nqp
91 lines (70 loc) · 2.09 KB
/
cap-test.nqp
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
###
### cap-test.nqp: Test the current capabilities of NQP
###
# TO USE:
# $ parrot-nqp cap-test.nqp
# First, declare the builtin "globals" we'd like to access
my $*OSNAME;
my $*OSVER;
my %*ENV;
my %*VM;
# Next, load the utility functions and fill in the "globals"
pir::load_bytecode('Plumage/NQPUtil.pbc');
say("Plumage::NQPUtil loaded.\n");
# Inline PIR
print("Inline PIR says: ");
test_inline_pir('Plumage');
sub test_inline_pir ($name) {
my $string := Q:PIR{
$S0 = 'Hello, '
$P0 = find_lex '$name'
$S1 = $P0
$S0 .= $S1
$S0 .= '!'
%r = box $S0
};
say($string);
}
# Binding only, no assignment. At least we have simple interpolation now.
our $libdir := get_versioned_libdir();
say("\nVersioned libdir: $libdir");
sub get_versioned_libdir () {
my $config := %*VM<config>;
my $libdir := $config<libdir>;
my $verdir := $config<versiondir>;
return $libdir ~ $verdir;
}
# The NQP parser complains about PIR-created globals
# unless they are (redundantly) declared in NQP.
say("Operating system: $*OSNAME $*OSVER");
say('%*ENV<PATH>: ' ~ %*ENV<PATH>);
# Class declaration is ... suboptimal ... at the moment
my $bar := BarFly.new(:flea('bag'));
say('$bar.foo(): ' ~ $bar.foo());
class BarFly {
# has $!flea;
# method new () {...}
method foo () {
# say($!flea);
return "BARFLE";
}
}
# These work OK, but qx() is insecurely implemented (in Parrot),
# and the error handling is not yet strong.
say("\nLocal directory:");
my $status := run('ls', '-l');
say("\nEnvironment variables:");
my $output := qx('env');
print($output);
# Test that %*ENV is writable
say("\nSetting environment variables:");
say('%*ENV<PATH> before: ' ~ %*ENV<PATH>);
say('echo $PATH before: ' ~ qx('echo $PATH'));
# XXXX: Need system-dependent path separator
%*ENV<PATH> := '/foo/bar:' ~ %*ENV<PATH>;
say('%*ENV<PATH> after: ' ~ %*ENV<PATH>);
say('echo $PATH after: ' ~ qx('echo $PATH'));
# Load JSON
say("\nLoad JSON:");
my $json := eval('{"a":[null,false,true,3.5,"Hello from JSON"]}', 'data_json');
say($json<a>[4]);