Merge branch 'master' into saltstack-states

This commit is contained in:
Paul Chaignon
2014-11-25 15:41:25 -05:00
152 changed files with 8678 additions and 589 deletions

367
samples/APL/UT.dyalog Normal file
View File

@@ -0,0 +1,367 @@
:NameSpace UT
sac ← 0
expect_orig ← expect ← ⎕NS⍬
exception ← ⍬
nexpect_orig ← nexpect ← ⎕NS⍬
∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace
load_display_if_not_already_loaded
load_salt_scripts_into_current_namespace_if_configured
FromSpace←1⊃⎕RSI
PRE_test←{}
POST_test←{}
COVER_step←{}
:If 0≠⎕NC'Conf'
:If Conf has'cover_target'
PRE_test←{{}⎕PROFILE'start'}
POST_test←{{}⎕PROFILE'stop'}
:EndIf
:EndIf
:If is_function Argument
TEST_step←single_function_test_function
COVER_file←Argument,'_coverage.html'
:ElseIf is_list_of_functions Argument
TEST_step←list_of_functions_test_function
COVER_file←'list_coverage.html'
:ElseIf is_file Argument
TEST_step←file_test_function
COVER_file←(get_file_name Argument),'_coverage.html'
:ElseIf is_dir Argument
test_files←test_files_in_dir Argument
TEST_step←test_dir_function
Argument←test_files
:EndIf
:If 0≠⎕NC'Conf'
:If Conf has'cover_target'
COVER_step←{Conf,←⊂('cover_file'COVER_file)
generate_coverage_page Conf}
:EndIf
:EndIf
PRE_test ⍬
Z←FromSpace TEST_step Argument
POST_test ⍬
COVER_step ⍬
∇ load_display_if_not_already_loaded
:If 0=⎕NC'#.DISPLAY'
'DISPLAY'#.⎕CY'display'
:EndIf
∇ load_salt_scripts_into_current_namespace_if_configured
:If 0≠⎕NC'#.UT.appdir'
:If ⍬≢#.UT.appdir
⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#'
⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#'
:EndIf
:EndIf
∇ Z←FromSpace single_function_test_function TestName
Z←run_ut FromSpace TestName
∇ Z←FromSpace list_of_functions_test_function ListOfNames;t
t←⎕TS
Z←run_ut¨{FromSpace ⍵}¨ListOfNames
t←⎕TS-t
('Test execution report')print_passed_crashed_failed Z t
∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t
FileNS←⎕SE.SALT.Load FilePath,' -target=#'
Functions←↓FileNS.⎕NL 3
TestFunctions←(is_test¨Functions)/Functions
:If (0/⍬,⊂0/'')≡TestFunctions
⎕←'No test functions found'
Z←⍬
:Else
t←⎕TS
Z←run_ut¨{FileNS ⍵}¨TestFunctions
t←⎕TS-t
(FilePath,' tests')print_passed_crashed_failed Z t
:EndIf
∇ Z←FromSpace test_dir_function Test_files
:If Test_files≡⍬/⍬,⊂''
⎕←'No test files found'
Z←⍬
:Else
Z←#.UT.run¨Test_files
:EndIf
∇ Z←get_file_name Argument;separator
separator←⊃⌽(Argument∊'/\')/Argument
Z←¯7↓separator↓Argument
∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML
ProfileData←⎕PROFILE'data'
ToCover←retrieve_coverables¨(⊃'cover_target'in Conf)
:If (ToCover)≡(⊂1)
ToCover←⊃ToCover
:EndIf
Representations←get_representation¨ToCover
CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations
HTML←generate_html CoverResults
Conf write_html_to_page HTML
⎕PROFILE'clear'
∇ Z←retrieve_coverables Something;nc;functions
nc←⎕NC Something
:If nc=3
Z←Something
:ElseIf nc=9
functions←strip¨↓⍎Something,'.⎕NL 3'
Z←{(Something,'.',⍵)}¨functions
:EndIf
∇ Z←strip input
Z←(input≠' ')/input
∇ Z←get_representation Function;nc;rep
nc←⎕NC⊂Function
:If nc=3.1
rep←↓⎕CR Function
rep[1]←⊂'∇',⊃rep[1]
rep,←⊂'∇'
rep←↑rep
:Else
rep←⎕CR Function
:EndIf
Z←rep
∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines
Indices←({name≡⍵}¨ProfileData[;1])/ProfileData[;1]
lines←ProfileData[Indices;2]
nc←⎕NC⊂name
:If 3.1=nc
functionlines←¯2+↓representation
:Else
functionlines←⊃↓representation
:EndIf
covered_lines←(⍬∘≢¨lines)/lines
Z←(nc lines functionlines covered_lines representation)
∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page
Covered←⊃⊃+/{4⊃⍵}¨CoverResults
Total←⊃⊃+/{3⊃⍵}¨CoverResults
Percentage←100×Covered÷Total
CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')'
ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults
Timestamp←generate_timestamp_text
Page←⍬
Page,←⊂⍬,'<html>'
Page,←⊂⍬,'<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>'
Page,←⊂⍬,'<style>pre cov {line-height:80%;}'
Page,←⊂⍬,'pre cov {color: green;}'
Page,←⊂⍬,'pre uncov {line-height:80%;}'
Page,←⊂⍬,'pre uncov {color:red;}</style>'
Page,←⊂⍬,CoverageText
Page,←⊂⍬,'<pre>'
Page,←ColorizedCode
Page,←⊂⍬,'</pre>'
Page,←Timestamp
Page,←⊂⍬,'</html>'
Z←Page
∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code
:If 3.1=⊃CoverResult
Colors←(2+3⊃CoverResult)⍴⊂'<uncov>'
Colors[1]←⊂''
Colors[Colors]←⊂''
Ends←(2+3⊃CoverResult)⍴⊂'</uncov>'
Ends[1]←⊂''
Ends[Ends]←⊂''
:Else
Colors←(3⊃CoverResult)⍴⊂'<uncov>'
Ends←(3⊃CoverResult)⍴⊂'</uncov>'
:EndIf
Colors[1+4⊃CoverResult]←⊂'<cov>'
Ends[1+4⊃CoverResult]←⊂'</cov>'
Code←↓5⊃CoverResult
Z←Colors,[1.5]Code
Z←{,(⎕UCS 13),⍵}/Z,Ends
∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS
TS←⎕TS
YYMMDD←⊃{,'-',⍵}/3↑TS
HHMMSS←⊃{,':',⍵}/3↑3↓TS
Z←'Page generated: ',YYMMDD,'|',HHMMSS
∇ Conf write_html_to_page Page;tie;filename
filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf)
:Trap 22
tie←filename ⎕NTIE 0
filename ⎕NERASE tie
filename ⎕NCREATE tie
:Else
tie←filename ⎕NCREATE 0
:EndTrap
Simple_array←⍕⊃,/Page
(⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie
∇ Z←is_function Argument
Z←'_TEST'≡¯5↑Argument
∇ Z←is_list_of_functions Argument
Z←2=≡Argument
∇ Z←is_file Argument
Z←'.dyalog'≡¯7↑Argument
∇ Z←is_dir Argument;attr
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no'
:Else
'gfa'⎕NA'I kernel32|GetFileAttributes* <0t'
:If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists
Z←⊃2 16attr ⍝ Return bit 4
:EndIf
:EndIf
∇ Z←test_files_in_dir Argument
:If 'Linux'≡5↑⊃'.'⎕WG'APLVersion'
Z←⎕SH'find ',Argument,' -name \*_tests.dyalog'
:Else
#.⎕CY'files'
Z←#.Files.Dir Argument,'\*_tests.dyalog'
Z←(Argument,'\')∘,¨Z
:EndIf
∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message
(returned crashed time)←execute_function ut_data
(pass crash fail)←determine_pass_crash_or_fail returned crashed
message←determine_message pass fail crashed(2⊃ut_data)returned time
print_message_to_screen message
Z←(pass crash fail)
∇ Z←execute_function ut_data;function;t
reset_UT_globals
function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2]
:Trap sac
:If 3.2≡⎕NC⊂function
t←⎕TS
Z←(⍎function,' ⍬')0
t←⎕TS-t
:Else
t←⎕TS
Z←(⍎function)0
t←⎕TS-t
:EndIf
:Else
Z←(↑⎕DM)1
:If exception≢⍬
expect←exception
Z[2]←0
t←⎕TS-t
:EndIf
:EndTrap
Z,←⊂t
∇ reset_UT_globals
expect_orig ← expect← ⎕NS⍬
exception←⍬
nexpect_orig ← nexpect← ⎕NS⍬
∇ Z←is_test FunctionName;wsIndex
wsIndex←FunctionName' '
FunctionName←(wsIndex-1)↑FunctionName
Z←'_TEST'≡¯5↑FunctionName
∇ Heading print_passed_crashed_failed(ArrayRes time)
⎕←'-----------------------------------------'
⎕←Heading
⎕←' ⍋ Passed: ',+/{1⊃⍵}¨ArrayRes
⎕←' ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes
⎕←' ⍒ Failed: ',+/{3⊃⍵}¨ArrayRes
⎕←' ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms'
determine_pass_crash_or_fail←{
r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0)
expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z
}
∇ Z←determine_message(pass fail crashed name returned time)
:If crashed
Z←'CRASHED: 'failure_message name returned
:ElseIf pass
Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms'
:Else
Z←'FAILED: 'failure_message name returned
:EndIf
∇ print_message_to_screen message
⎕←message
∇ Z←term_to_text Term;Text;Rows
Text←#.DISPLAY Term
Rows←1⊃Text
Z←(Rows 4''),Text
∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm
hdr←Cause,name
exp←'Expected'
expterm←term_to_text #.UT.expect
got←'Got'
gotterm←term_to_text returned
Z←align_and_join_message_parts hdr exp expterm got gotterm
∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W
(hdr exp expterm got gotterm)←Parts
(R1 C1)←expterm
(R2 C2)←gotterm
W←⊃⊃⌈/C1 C2(hdr)(exp)(got)
Z←(W↑hdr),[0.5](W↑exp)
Z←Z⍪(R1 W↑expterm)
Z←Z⍪(W↑got)
Z←Z⍪(R2 W↑gotterm)
∇ Z←confparam in config
Z←1↓⊃({confparam≡⊃⍵}¨config)/config
∇ Z←config has confparam
Z←/{confparam≡⊃⍵}¨config
:EndNameSpace

View File

@@ -0,0 +1,110 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<project name="WebBuild">
<!-- generate timestamps -->
<tstamp />
<!-- Debugging Macro -->
<import file="echopath.xml" />
<!-- JS build files macro -->
<import file="rhinoscript.xml" />
<!-- Component Build Files -->
<import file="setup.xml" />
<import file="clean.xml" />
<import file="copy.xml" />
<import file="file.transform.xml" />
<import file="external.tools.xml" />
<import file="rename.xml" />
<import file="js.xml" />
<import file="css.xml" />
<import file="img.xml" />
<import file="png8.xml" />
<import file="yui.xml" />
<import file="cdn.xml" />
<import file="datauri.xml" />
<import file="devlive.xml" />
<!-- This dirname is the only complete path we know for sure, everything builds off of it -->
<dirname property="dir.build" file="${ant.file.WebBuild}" />
<!-- get name for newly built folder -->
<basename property="app.name" file="${basedir}" />
<!-- read global properties file -->
<property file="${dir.build}\build.properties" />
<!-- Build Directories -->
<property name="dir.build.js" location="${dir.build}/js" />
<!-- App Directories -->
<property name="dir.app" location="${dir.result}/${app.name}" />
<property name="dir.app.temp" location="${dir.temp}/${app.name}" />
<property name="dir.app.files" location="${dir.app.temp}/${dir.files}" />
<!-- Files -->
<property name="mapping.js" location="${dir.app.temp}/${mapping.file.js}" />
<property name="mapping.css" location="${dir.app.temp}/${mapping.file.css}" />
<property name="mapping.img" location="${dir.app.temp}/${mapping.file.img}" />
<property name="mapping.swf" location="${dir.app.temp}/${mapping.file.swf}" />
<property name="mapping.fonts" location="${dir.app.temp}/${mapping.file.fonts}" />
<!-- Tool Directories -->
<property name="dir.bin" location="${dir.build}/Bin" />
<property name="dir.jar" location="${dir.bin}/jar" />
<!-- Tool Files -->
<property name="tools.compressor" location="${dir.jar}/${tools.file.compressor}" />
<property name="tools.cssembed" location="${dir.jar}/${tools.file.cssembed}" />
<property name="tools.filetransform" location="${dir.jar}/${tools.file.filetransform}" />
<property name="tools.optipng" location="${dir.bin}/${tools.file.optipng}" />
<property name="tools.jpegtran" location="${dir.bin}/${tools.file.jpegtran}" />
<!-- BUILD TARGETS -->
<!-- low level utility build targets -->
<!-- Build the tools -->
<target name="-setup.build.tools"
depends="-define.filetransform, -define.cssembed, -define.yuicompressor, -define.jsclasspath"
/>
<!-- set up filesystem properties -->
<target
name="-setup"
depends="-setup.mode, -setup.conditions, -setup.js, -setup.css, -setup.swf, -setup.img, -setup.fonts, -setup.yui"
/>
<!-- utility-ish targets -->
<target name="copy" depends="clean, tools, -copy" />
<target name="tools" depends="-setup.build.tools" />
<target name="finalize" depends="copy, -finalize" />
<target name="-prepare" depends="copy, -setup" />
<!-- individual component build targets (empty descriptions are to make sure they show in "ant -p") -->
<target name="devlive" depends="-prepare, -devlive" description="" />
<target name="js" depends="-prepare, -js" description="" />
<target name="css" depends="-prepare, -css" description="" />
<target name="rename" depends="-prepare, -rename" description="" />
<target name="yui" depends="-prepare, rename, -yui" description="" />
<target name="cdn" depends="-prepare, -cdn" description="" />
<!-- high level build targets (Excluding of images is on purpose here, it's slow) -->
<target name="core"
depends="devlive, js, css, cdn, rename, yui, -js.inline"
description="Core build work"
/>
<target name="prod"
depends="core, finalize"
description="Full Production Build"
/>
<!-- debug target -->
<target name="debug" depends="-setup">
<echoproperties/>
</target>
</project>

View File

@@ -0,0 +1 @@
ant.xml

View File

@@ -0,0 +1,66 @@
ORG 0000h
SJMP START
ORG 0003h
LCALL INT0_ISR
RETI
ORG 000Bh
LCALL T0_ISR
RETI
ORG 0013h
LCALL INT1_ISR
RETI
ORG 001Bh
LCALL T1_ISR
RETI
ORG 0023h
LCALL UART_ISR
RETI
ORG 0030h
START:
MOV A,#11111110b
SETB IT0 ; Set External Interrupt 0 to be falling edge triggered
SETB EX0 ; Enable External Interrut 0
SETB EA ; Enable Interrupt
LEFT:
CJNE A,#01111111b,LOOP1
JMP RIGHT
LOOP1:
MOV P1,A
RL A
LCALL DELAY
SJMP LEFT
RIGHT:
CJNE A,#11111110b,LOOP2
JMP LEFT
LOOP2:
MOV P1,A
RR A
LCALL DELAY
SJMP RIGHT
INT0_ISR:
MOV R1,#3
FLASH:
MOV P1,#00h
LCALL DELAY
MOV P1,#0FFh
LCALL DELAY
DJNZ R1,FLASH
RET
T0_ISR:
RET
INT1_ISR:
RET
T1_ISR:
RET
UART_ISR:
RET
DELAY: MOV R5,#20 ;R5*20 mS
D1: MOV R6,#40
D2: MOV R7,#249
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END

10
samples/C++/bar.hh Normal file
View File

@@ -0,0 +1,10 @@
class Bar
{
protected:
char *name;
public:
void hello();
}

View File

@@ -1,13 +1,13 @@
doc "Test function for Ceylon"
by "Enrique"
"Test function for Ceylon"
by ("Enrique")
shared void test() {
print("test");
print("test");
}
doc "Test class for Ceylon"
"Test class for Ceylon"
shared class Test(name) satisfies Comparable<Test> {
shared String name;
shared actual String string = "Test " name ".";
shared actual String string = "Test ``name``.";
shared actual Comparison compare(Test other) {
return name<=>other.name;

11
samples/Clean/GenHylo.dcl Normal file
View File

@@ -0,0 +1,11 @@
definition module GenHylo
import StdGeneric, GenMap
:: Fix f = In (f .(Fix f))
Out :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w]
hylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f
cata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f
ana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f

9
samples/Clean/GenMap.dcl Normal file
View File

@@ -0,0 +1,9 @@
definition module GenMap
import StdGeneric
generic gMap a b :: .a -> .b
derive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!}
derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)

19
samples/Clean/GenMap.icl Normal file
View File

@@ -0,0 +1,19 @@
implementation module GenMap
import StdClass, StdArray, StdInt, StdFunc
import StdGeneric, _Array
generic gMap a b :: .a -> .b
gMap{|c|} x = x
gMap{|UNIT|} x = x
gMap{|PAIR|} fx fy (PAIR x y) = PAIR (fx x) (fy y)
gMap{|EITHER|} fl fr (LEFT x) = LEFT (fl x)
gMap{|EITHER|} fl fr (RIGHT x) = RIGHT (fr x)
gMap{|CONS|} f (CONS x) = CONS (f x)
gMap{|FIELD|} f (FIELD x) = FIELD (f x)
gMap{|OBJECT|} f (OBJECT x) = OBJECT (f x)
gMap{|{}|} f xs = mapArray f xs
gMap{|{!}|} f xs = mapArray f xs
derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,)

54
samples/Clean/fsieve.icl Normal file
View File

@@ -0,0 +1,54 @@
module fsieve
/*
The Fast Sieve of Eratosthenes.
A sequential and optimized version of the sieve of Eratosthenes.
The program calculates a list of the first NrOfPrime primes.
The result of the program is the NrOfPrimes'th prime.
Strictness annotations have been added because the strictness analyser
is not able to deduce all strictness information. Removal of these !'s
will make the program about 20% slower.
On a machine without a math coprocessor the execution of this
program might take a (very) long time. Set NrOfPrimes to a smaller value.
*/
import StdClass; // RWS
import StdInt, StdReal
NrOfPrimes :== 3000
// The sieve algorithm: generate an infinite list of all primes.
Primes::[Int]
Primes = pr where pr = [5 : Sieve 7 4 pr]
Sieve::Int !Int [Int] -> [Int]
Sieve g i prs
| IsPrime prs g (toInt (sqrt (toReal g))) = [g : Sieve` g i prs]
= Sieve (g + i) (6 - i) prs
Sieve`::Int Int [Int] -> [Int]
Sieve` g i prs = Sieve (g + i) (6 - i) prs
IsPrime::[Int] !Int Int -> Bool
IsPrime [f:r] pr bd | f>bd = True
| pr rem f==0 = False
= IsPrime r pr bd
// Select is used to get the NrOfPrimes'th prime from the infinite list.
Select::[x] Int -> x
Select [f:r] 1 = f
Select [f:r] n = Select r (n - 1)
/* The Start rule: Select the NrOfPrimes'th prime from the list of primes
generated by Primes.
*/
Start::Int
Start = Select [2, 3 : Primes] NrOfPrimes

99
samples/Clean/sem.icl Normal file
View File

@@ -0,0 +1,99 @@
module monadicSemantics
import StdEnv, StdGeneric, GenMap, GenHylo
/* For fun I implemented the recursive datastructre Exp and Stm as fixpoints
This helps us define recursive functions on them (only a little bit though)
However deriving gMap for Fix did not works out of the box
I had to remove some uniqueness typing in GenMap and GenHylo */
:: Op = Plus | Minus | Times | Rem | Equal | LessThan
:: Var :== String
:: ExpP a = Int Int | Var Var | Op Op a a
:: Exp :== Fix ExpP
:: StmP a = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont
:: Stm :== Fix StmP
derive gMap ExpP, StmP, Fix
// Environment. Semantics is basically Env -> Env
:: Env :== Var -> Int
:: Sem :== Env -> (Int, Env)
empty = \v . 0
// return
rtn :: Int -> Sem
rtn i = \e. (i, e)
// the usual bind
(>>=) infixl 1 :: Sem (Int->Sem) -> Sem
(>>=) x y = \e. (\(i,e2).y i e2) (x e)
(>>|) infixl 1 :: Sem Sem -> Sem
(>>|) x y = x >>= \_. y
// read variable from environment
read :: Var -> Sem
read v = \e. (e v, e)
// assign value to give variable in environment
write :: Var Int -> Sem
write v i = \e. (i, \w. if (w==v) i (e w))
// semantics
class sem a :: a -> Sem
operator :: Op -> Int -> Int -> Int
operator Plus = (+)
operator Minus = (-)
operator Times = (*)
operator Rem = rem
operator Equal = \x y . if (x==y) 1 0
operator LessThan = \x y . if (x< y) 1 0
// semantics of expressions
instance sem Exp where
sem x = cata phi x where
phi (Int n) = rtn n
phi (Var v) = read v
phi (Op op x y) = x >>= \v1. y >>= return o (operator op v1)
// semantics of statments
// NOTE: while will always return 0, as it might not even be executed
instance sem Stm where
sem x = cata phi x where
phi (Assign v e) = sem e >>= write v
phi (If e s1 s2) = sem e >>= \b . if (b<>0) s1 s2
phi stm=:(While e s) = sem e >>= \b . if (b<>0) (s >>| phi stm) (phi Cont)
phi (Seq s1 s2) = s1 >>| s2 // Here the cata *finally* pays off :D
phi Cont = rtn 0
// convenience functions
int = In o Int
var = In o Var
op o = In o2 (Op o)
assign = In o2 Assign
ifte e = In o2 (If e)
while = In o2 While
seq = In o2 Seq
cont = In Cont
// test case, also testing the new operator <
pEuclides =
while (op LessThan (int 0) (var "b"))(
seq (assign "r" (op Rem (var "a") (var "b")))
(seq (assign "a" (var "b"))
( (assign "b" (var "r")))
)
)
Start = fst (program start) where
program = sem pEuclides >>| read "a"
start "a" = 9
start "b" = 12
start _ = 0
// Helper
(o2) infixr 9
(o2) f g x :== f o (g x)

14
samples/Clean/stack.dcl Normal file
View File

@@ -0,0 +1,14 @@
definition module stack
:: Stack a
newStack :: (Stack a)
push :: a (Stack a) -> Stack a
pushes :: [a] (Stack a) -> Stack a
pop :: (Stack a) -> Stack a
popn :: Int (Stack a) -> Stack a
top :: (Stack a) -> a
topn :: Int (Stack a) -> [a]
elements :: (Stack a) -> [a]
count :: (Stack a) -> Int

33
samples/Clean/stack.icl Normal file
View File

@@ -0,0 +1,33 @@
implementation module stack
import StdEnv
:: Stack a :== [a]
newStack :: (Stack a)
newStack = []
push :: a (Stack a) -> Stack a
push x s = [x:s]
pushes :: [a] (Stack a) -> Stack a
pushes x s = x ++ s
pop :: (Stack a) -> Stack a
pop [] = abort "Cannot use pop on an empty stack"
pop [e:s] = s
popn :: Int (Stack a) -> Stack a
popn n s = drop n s
top :: (Stack a) -> a
top [] = abort "Cannot use top on an empty stack"
top [e:s] = e
topn :: Int (Stack a) -> [a]
topn n s = take n s
elements :: (Stack a) -> [a]
elements s = s
count :: (Stack a) -> Int
count s = length s

16
samples/Clean/streams.dcl Normal file
View File

@@ -0,0 +1,16 @@
definition module streams
import StdEnv
instance zero [Real]
instance one [Real]
instance + [Real]
instance - [Real]
instance * [Real]
instance / [Real]
X :: [Real]
invert :: [Real] -> [Real]
pow :: [Real] Int -> [Real]
(shuffle) infixl 7 :: [Real] [Real] -> [Real]

49
samples/Clean/streams.icl Normal file
View File

@@ -0,0 +1,49 @@
implementation module streams
import StdEnv
instance zero [Real]
where
zero = [] //Infinite row of zeroes represented as empty list to ease computation
instance one [Real]
where
one = [1.0:zero]
instance + [Real]
where
(+) [s:s`] [t:t`] = [s+t:s`+t`]
(+) [s:s`] [] = [s:s`]
(+) [] [t:t`] = [t:t`]
(+) [] [] = []
instance - [Real]
where
(-) [s:s`] [t:t`] = [s-t:s`-t`]
(-) [s:s`] [] = [s:s`]
(-) [] [t:t`] = [-1.0] * [t:t`]
(-) [] [] = []
instance * [Real]
where
(*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`]
(*) _ _ = []
instance / [Real]
where
(/) s t = s * (invert t)
X :: [Real]
X = [0.0:one]
invert :: [Real] -> [Real]
invert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]]
pow :: [Real] Int -> [Real]
pow s 0 = one
pow s n = s * pow s (n-1)
(shuffle) infixl 7 :: [Real] [Real] -> [Real]
(shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`]
(shuffle) _ _ = []

View File

@@ -0,0 +1,40 @@
###* @cjsx React.DOM ###
define 'myProject.ReactExampleComponent', [
'React'
'myProject.ExampleStore'
'myProject.ExampleActions'
'myProject.ReactExampleTable'
], (React, ExampleStore, ExampleActions, ReactExampleTable ) ->
ReactExampleComponent = React.createClass
mixins: [ListenMixin]
getInitialState: ->
rows: ExampleStore.getRows()
meta: ExampleStore.getMeta()
componentWillMount: ->
@listenTo ExampleStore
componentDidMount: ->
ExampleActions.getExampleData()
onStoreChange: ->
if this.isMounted()
@setState
rows: ExampleStore.getRows()
meta: ExampleStore.getMeta()
componentWillUnmount: ->
@stopListening ExampleStore
render: ->
<div className="page-wrap">
<header>
<strong> {@state.title} </strong>
<header>
<ReactExampleTable
rows={@state.rows},
meta={@state.meta}
/>
</div>

25
samples/FORTRAN/sample1.f Normal file
View File

@@ -0,0 +1,25 @@
c comment
* comment
program main
end
subroutine foo( i, x, b )
INTEGER i
REAL x
LOGICAL b
if( i.ne.0 ) then
call bar( -i )
end if
return
end
double complex function baz()
baz = (0.0d0,0.0d0)
return
end

View File

@@ -0,0 +1,25 @@
c comment
* comment
program main
end
subroutine foo( i, x, b )
INTEGER i
REAL x
LOGICAL b
if( i.ne.0 ) then
call bar( -i )
end if
return
end
double complex function baz()
baz = (0.0d0,0.0d0)
return
end

25
samples/FORTRAN/sample2.f Normal file
View File

@@ -0,0 +1,25 @@
PROGRAM MAIN
END
C comment
* comment
SUBROUTINE foo( i, x, b )
INTEGER i
REAL x
LOGICAL b
IF( i.NE.0 ) THEN
CALL bar( -i )
END IF
RETURN
END
DOUBLE COMPLEX FUNCTION baz()
baz = (0.0d0,0.0d0)
RETURN
END

25
samples/FORTRAN/sample3.F Normal file
View File

@@ -0,0 +1,25 @@
c comment
* comment
program main
end
subroutine foo( i, x, b )
INTEGER i
REAL x
LOGICAL b
if( i.ne.0 ) then
call bar( -i )
end if
return
end
double complex function baz()
baz = (0.0d0,0.0d0)
return
end

8
samples/Forth/bitmap.frt Normal file
View File

@@ -0,0 +1,8 @@
\ Bit arrays.
: bits ( u1 -- u2 ) 7 + 3 rshift ;
: bitmap ( u "name" -- ) create bits here over erase allot
does> ( u -- a x ) over 3 rshift + 1 rot 7 and lshift ;
: bit@ ( a x -- f ) swap c@ and ;
: 1bit ( a x -- ) over c@ or swap c! ;
: 0bit ( a x -- ) invert over c@ and swap c! ;
: bit! ( f a x -- ) rot if 1bit else 0bit then ;

252
samples/Forth/core.f Normal file
View File

@@ -0,0 +1,252 @@
: immediate lastxt @ dup c@ negate swap c! ;
: \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff
: char \ ( "word" -- char )
bl-word here 1+ c@ ;
: ahead here 0 , ;
: resolve here swap ! ;
: ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;
: postpone-nonimmediate [ ' literal , ' compile, ] literal , ;
: create dovariable_code header, reveal ;
create postponers
' postpone-nonimmediate ,
' abort ,
' , ,
: word \ ( char "<chars>string<char>" -- caddr )
drop bl-word here ;
: postpone \ ( C: "word" -- )
bl word find 1+ cells postponers + @ execute ; immediate
: unresolved \ ( C: "word" -- orig )
postpone postpone postpone ahead ; immediate
: chars \ ( n1 -- n2 )
;
: else \ ( -- ) ( C: orig1 -- orig2 )
unresolved branch swap resolve ; immediate
: if \ ( flag -- ) ( C: -- orig )
unresolved 0branch ; immediate
: then \ ( -- ) ( C: orig -- )
resolve ; immediate
: [char] \ ( "word" -- )
char postpone literal ; immediate
: (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ;
: does> postpone (does>) ; immediate
: begin \ ( -- ) ( C: -- dest )
here ; immediate
: while \ ( x -- ) ( C: dest -- orig dest )
unresolved 0branch swap ; immediate
: repeat \ ( -- ) ( C: orig dest -- )
postpone branch , resolve ; immediate
: until \ ( x -- ) ( C: dest -- )
postpone 0branch , ; immediate
: recurse lastxt @ compile, ; immediate
: pad \ ( -- addr )
here 1024 + ;
: parse \ ( char "string<char>" -- addr n )
pad >r begin
source? if <source 2dup <> else 0 0 then
while
r@ c! r> 1+ >r
repeat 2drop pad r> over - ;
: ( \ ( "string<paren>" -- )
[ char ) ] literal parse 2drop ; immediate
\ TODO: If necessary, refill and keep parsing.
: string, ( addr n -- )
here over allot align swap cmove ;
: (s") ( -- addr n ) ( R: ret1 -- ret2 )
r> dup @ swap cell+ 2dup + aligned >r swap ;
create squote 128 allot
: s" ( "string<quote>" -- addr n )
state @ if
postpone (s") [char] " parse dup , string,
else
[char] " parse >r squote r@ cmove squote r>
then ; immediate
: (abort") ( ... addr n -- ) ( R: ... -- )
cr type cr abort ;
: abort" ( ... x "string<quote>" -- ) ( R: ... -- )
postpone if postpone s" postpone (abort") postpone then ; immediate
\ ----------------------------------------------------------------------
( Core words. )
\ TODO: #
\ TODO: #>
\ TODO: #s
: and ( x y -- x&y ) nand invert ;
: * 1 2>r 0 swap begin r@ while
r> r> swap 2dup dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
\ TODO: */mod
: +loop ( -- ) ( C: nest-sys -- )
postpone (+loop) postpone 0branch , postpone unloop ; immediate
: space bl emit ;
: ?.- dup 0 < if [char] - emit negate then ;
: digit [char] 0 + emit ;
: (.) base @ /mod ?dup if recurse then digit ;
: ." ( "string<quote>" -- ) postpone s" postpone type ; immediate
: . ( x -- ) ?.- (.) space ;
: postpone-number ( caddr -- )
0 0 rot count >number dup 0= if
2drop nip
postpone (literal) postpone (literal) postpone ,
postpone literal postpone ,
else
." Undefined: " type cr abort
then ;
' postpone-number postponers cell+ !
: / ( x y -- x/y ) /mod nip ;
: 0< ( n -- flag ) 0 < ;
: 1- ( n -- n-1 ) -1 + ;
: 2! ( x1 x2 addr -- ) swap over ! cell+ ! ;
: 2* ( n -- 2n ) dup + ;
\ Kernel: 2/
: 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ;
\ Kernel: 2drop
\ Kernel: 2dup
\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )
\ 3 pick 3 pick ;
\ TODO: 2swap
\ TODO: <#
: abs ( n -- |n| )
dup 0< if negate then ;
\ TODO: accept
: c, ( n -- )
here c! 1 chars allot ;
: char+ ( n1 -- n2 )
1+ ;
: constant create , does> @ ;
: decimal ( -- )
10 base ! ;
: depth ( -- n )
data_stack 100 cells + 'SP @ - /cell / 2 - ;
: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )
postpone 2>r here ; immediate
\ TODO: environment?
\ TODO: evaluate
\ TODO: fill
\ TODO: fm/mod )
\ TODO: hold
: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )
'RP @ 3 cells + @ ;
\ TODO: leave
: loop ( -- ) ( C: nest-sys -- )
postpone 1 postpone (+loop)
postpone 0branch ,
postpone unloop ; immediate
: lshift begin ?dup while 1- swap dup + swap repeat ;
: rshift 1 begin over while dup + swap 1- swap repeat nip
2>r 0 1 begin r@ while
r> r> 2dup swap dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
: max ( x y -- max[x,y] )
2dup > if drop else nip then ;
\ Kernel: min
\ TODO: mod
\ TODO: move
: (quit) ( R: ... -- )
return_stack 100 cells + 'RP !
0 'source-id ! tib ''source ! #tib ''#source !
postpone [
begin
refill
while
interpret state @ 0= if ." ok" cr then
repeat
bye ;
' (quit) ' quit >body cell+ !
\ TODO: s>d
\ TODO: sign
\ TODO: sm/rem
: spaces ( n -- )
0 do space loop ;
\ TODO: u.
: signbit ( -- n ) -1 1 rshift invert ;
: xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ;
: u< ( x y -- flag ) signbit xor swap signbit xor > ;
\ TODO: um/mod
: variable ( "word" -- )
create /cell allot ;
: ['] \ ( C: "word" -- )
' postpone literal ; immediate

252
samples/Forth/core.for Normal file
View File

@@ -0,0 +1,252 @@
: immediate lastxt @ dup c@ negate swap c! ;
: \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff
: char \ ( "word" -- char )
bl-word here 1+ c@ ;
: ahead here 0 , ;
: resolve here swap ! ;
: ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;
: postpone-nonimmediate [ ' literal , ' compile, ] literal , ;
: create dovariable_code header, reveal ;
create postponers
' postpone-nonimmediate ,
' abort ,
' , ,
: word \ ( char "<chars>string<char>" -- caddr )
drop bl-word here ;
: postpone \ ( C: "word" -- )
bl word find 1+ cells postponers + @ execute ; immediate
: unresolved \ ( C: "word" -- orig )
postpone postpone postpone ahead ; immediate
: chars \ ( n1 -- n2 )
;
: else \ ( -- ) ( C: orig1 -- orig2 )
unresolved branch swap resolve ; immediate
: if \ ( flag -- ) ( C: -- orig )
unresolved 0branch ; immediate
: then \ ( -- ) ( C: orig -- )
resolve ; immediate
: [char] \ ( "word" -- )
char postpone literal ; immediate
: (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ;
: does> postpone (does>) ; immediate
: begin \ ( -- ) ( C: -- dest )
here ; immediate
: while \ ( x -- ) ( C: dest -- orig dest )
unresolved 0branch swap ; immediate
: repeat \ ( -- ) ( C: orig dest -- )
postpone branch , resolve ; immediate
: until \ ( x -- ) ( C: dest -- )
postpone 0branch , ; immediate
: recurse lastxt @ compile, ; immediate
: pad \ ( -- addr )
here 1024 + ;
: parse \ ( char "string<char>" -- addr n )
pad >r begin
source? if <source 2dup <> else 0 0 then
while
r@ c! r> 1+ >r
repeat 2drop pad r> over - ;
: ( \ ( "string<paren>" -- )
[ char ) ] literal parse 2drop ; immediate
\ TODO: If necessary, refill and keep parsing.
: string, ( addr n -- )
here over allot align swap cmove ;
: (s") ( -- addr n ) ( R: ret1 -- ret2 )
r> dup @ swap cell+ 2dup + aligned >r swap ;
create squote 128 allot
: s" ( "string<quote>" -- addr n )
state @ if
postpone (s") [char] " parse dup , string,
else
[char] " parse >r squote r@ cmove squote r>
then ; immediate
: (abort") ( ... addr n -- ) ( R: ... -- )
cr type cr abort ;
: abort" ( ... x "string<quote>" -- ) ( R: ... -- )
postpone if postpone s" postpone (abort") postpone then ; immediate
\ ----------------------------------------------------------------------
( Core words. )
\ TODO: #
\ TODO: #>
\ TODO: #s
: and ( x y -- x&y ) nand invert ;
: * 1 2>r 0 swap begin r@ while
r> r> swap 2dup dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
\ TODO: */mod
: +loop ( -- ) ( C: nest-sys -- )
postpone (+loop) postpone 0branch , postpone unloop ; immediate
: space bl emit ;
: ?.- dup 0 < if [char] - emit negate then ;
: digit [char] 0 + emit ;
: (.) base @ /mod ?dup if recurse then digit ;
: ." ( "string<quote>" -- ) postpone s" postpone type ; immediate
: . ( x -- ) ?.- (.) space ;
: postpone-number ( caddr -- )
0 0 rot count >number dup 0= if
2drop nip
postpone (literal) postpone (literal) postpone ,
postpone literal postpone ,
else
." Undefined: " type cr abort
then ;
' postpone-number postponers cell+ !
: / ( x y -- x/y ) /mod nip ;
: 0< ( n -- flag ) 0 < ;
: 1- ( n -- n-1 ) -1 + ;
: 2! ( x1 x2 addr -- ) swap over ! cell+ ! ;
: 2* ( n -- 2n ) dup + ;
\ Kernel: 2/
: 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ;
\ Kernel: 2drop
\ Kernel: 2dup
\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )
\ 3 pick 3 pick ;
\ TODO: 2swap
\ TODO: <#
: abs ( n -- |n| )
dup 0< if negate then ;
\ TODO: accept
: c, ( n -- )
here c! 1 chars allot ;
: char+ ( n1 -- n2 )
1+ ;
: constant create , does> @ ;
: decimal ( -- )
10 base ! ;
: depth ( -- n )
data_stack 100 cells + 'SP @ - /cell / 2 - ;
: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )
postpone 2>r here ; immediate
\ TODO: environment?
\ TODO: evaluate
\ TODO: fill
\ TODO: fm/mod )
\ TODO: hold
: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )
'RP @ 3 cells + @ ;
\ TODO: leave
: loop ( -- ) ( C: nest-sys -- )
postpone 1 postpone (+loop)
postpone 0branch ,
postpone unloop ; immediate
: lshift begin ?dup while 1- swap dup + swap repeat ;
: rshift 1 begin over while dup + swap 1- swap repeat nip
2>r 0 1 begin r@ while
r> r> 2dup swap dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
: max ( x y -- max[x,y] )
2dup > if drop else nip then ;
\ Kernel: min
\ TODO: mod
\ TODO: move
: (quit) ( R: ... -- )
return_stack 100 cells + 'RP !
0 'source-id ! tib ''source ! #tib ''#source !
postpone [
begin
refill
while
interpret state @ 0= if ." ok" cr then
repeat
bye ;
' (quit) ' quit >body cell+ !
\ TODO: s>d
\ TODO: sign
\ TODO: sm/rem
: spaces ( n -- )
0 do space loop ;
\ TODO: u.
: signbit ( -- n ) -1 1 rshift invert ;
: xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ;
: u< ( x y -- flag ) signbit xor swap signbit xor > ;
\ TODO: um/mod
: variable ( "word" -- )
create /cell allot ;
: ['] \ ( C: "word" -- )
' postpone literal ; immediate

252
samples/Forth/core1.F Normal file
View File

@@ -0,0 +1,252 @@
: immediate lastxt @ dup c@ negate swap c! ;
: \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff
: char \ ( "word" -- char )
bl-word here 1+ c@ ;
: ahead here 0 , ;
: resolve here swap ! ;
: ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ;
: postpone-nonimmediate [ ' literal , ' compile, ] literal , ;
: create dovariable_code header, reveal ;
create postponers
' postpone-nonimmediate ,
' abort ,
' , ,
: word \ ( char "<chars>string<char>" -- caddr )
drop bl-word here ;
: postpone \ ( C: "word" -- )
bl word find 1+ cells postponers + @ execute ; immediate
: unresolved \ ( C: "word" -- orig )
postpone postpone postpone ahead ; immediate
: chars \ ( n1 -- n2 )
;
: else \ ( -- ) ( C: orig1 -- orig2 )
unresolved branch swap resolve ; immediate
: if \ ( flag -- ) ( C: -- orig )
unresolved 0branch ; immediate
: then \ ( -- ) ( C: orig -- )
resolve ; immediate
: [char] \ ( "word" -- )
char postpone literal ; immediate
: (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ;
: does> postpone (does>) ; immediate
: begin \ ( -- ) ( C: -- dest )
here ; immediate
: while \ ( x -- ) ( C: dest -- orig dest )
unresolved 0branch swap ; immediate
: repeat \ ( -- ) ( C: orig dest -- )
postpone branch , resolve ; immediate
: until \ ( x -- ) ( C: dest -- )
postpone 0branch , ; immediate
: recurse lastxt @ compile, ; immediate
: pad \ ( -- addr )
here 1024 + ;
: parse \ ( char "string<char>" -- addr n )
pad >r begin
source? if <source 2dup <> else 0 0 then
while
r@ c! r> 1+ >r
repeat 2drop pad r> over - ;
: ( \ ( "string<paren>" -- )
[ char ) ] literal parse 2drop ; immediate
\ TODO: If necessary, refill and keep parsing.
: string, ( addr n -- )
here over allot align swap cmove ;
: (s") ( -- addr n ) ( R: ret1 -- ret2 )
r> dup @ swap cell+ 2dup + aligned >r swap ;
create squote 128 allot
: s" ( "string<quote>" -- addr n )
state @ if
postpone (s") [char] " parse dup , string,
else
[char] " parse >r squote r@ cmove squote r>
then ; immediate
: (abort") ( ... addr n -- ) ( R: ... -- )
cr type cr abort ;
: abort" ( ... x "string<quote>" -- ) ( R: ... -- )
postpone if postpone s" postpone (abort") postpone then ; immediate
\ ----------------------------------------------------------------------
( Core words. )
\ TODO: #
\ TODO: #>
\ TODO: #s
: and ( x y -- x&y ) nand invert ;
: * 1 2>r 0 swap begin r@ while
r> r> swap 2dup dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
\ TODO: */mod
: +loop ( -- ) ( C: nest-sys -- )
postpone (+loop) postpone 0branch , postpone unloop ; immediate
: space bl emit ;
: ?.- dup 0 < if [char] - emit negate then ;
: digit [char] 0 + emit ;
: (.) base @ /mod ?dup if recurse then digit ;
: ." ( "string<quote>" -- ) postpone s" postpone type ; immediate
: . ( x -- ) ?.- (.) space ;
: postpone-number ( caddr -- )
0 0 rot count >number dup 0= if
2drop nip
postpone (literal) postpone (literal) postpone ,
postpone literal postpone ,
else
." Undefined: " type cr abort
then ;
' postpone-number postponers cell+ !
: / ( x y -- x/y ) /mod nip ;
: 0< ( n -- flag ) 0 < ;
: 1- ( n -- n-1 ) -1 + ;
: 2! ( x1 x2 addr -- ) swap over ! cell+ ! ;
: 2* ( n -- 2n ) dup + ;
\ Kernel: 2/
: 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ;
\ Kernel: 2drop
\ Kernel: 2dup
\ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 )
\ 3 pick 3 pick ;
\ TODO: 2swap
\ TODO: <#
: abs ( n -- |n| )
dup 0< if negate then ;
\ TODO: accept
: c, ( n -- )
here c! 1 chars allot ;
: char+ ( n1 -- n2 )
1+ ;
: constant create , does> @ ;
: decimal ( -- )
10 base ! ;
: depth ( -- n )
data_stack 100 cells + 'SP @ - /cell / 2 - ;
: do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys )
postpone 2>r here ; immediate
\ TODO: environment?
\ TODO: evaluate
\ TODO: fill
\ TODO: fm/mod )
\ TODO: hold
: j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 )
'RP @ 3 cells + @ ;
\ TODO: leave
: loop ( -- ) ( C: nest-sys -- )
postpone 1 postpone (+loop)
postpone 0branch ,
postpone unloop ; immediate
: lshift begin ?dup while 1- swap dup + swap repeat ;
: rshift 1 begin over while dup + swap 1- swap repeat nip
2>r 0 1 begin r@ while
r> r> 2dup swap dup + 2>r and if swap over + swap then dup +
repeat r> r> 2drop drop ;
: max ( x y -- max[x,y] )
2dup > if drop else nip then ;
\ Kernel: min
\ TODO: mod
\ TODO: move
: (quit) ( R: ... -- )
return_stack 100 cells + 'RP !
0 'source-id ! tib ''source ! #tib ''#source !
postpone [
begin
refill
while
interpret state @ 0= if ." ok" cr then
repeat
bye ;
' (quit) ' quit >body cell+ !
\ TODO: s>d
\ TODO: sign
\ TODO: sm/rem
: spaces ( n -- )
0 do space loop ;
\ TODO: u.
: signbit ( -- n ) -1 1 rshift invert ;
: xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ;
: u< ( x y -- flag ) signbit xor swap signbit xor > ;
\ TODO: um/mod
: variable ( "word" -- )
create /cell allot ;
: ['] \ ( C: "word" -- )
' postpone literal ; immediate

7
samples/Forth/enum.frt Normal file
View File

@@ -0,0 +1,7 @@
\ Implements ENUM.
\ Double DOES>!
: enum create 0 , does> create dup @ 1 rot +! , does> @ ;
\ But this is simpler.
: enum create 0 , does> dup @ constant 1 swap +! ;

8
samples/Forth/macros.frt Normal file
View File

@@ -0,0 +1,8 @@
\ Simplifies compiling words.
: [[ ; immediate
: '<> >in @ ' swap >in ! <> ;
: (]]) begin dup '<> while postpone postpone repeat drop ;
: ]] ['] [[ (]]) ; immediate
( Usage: : foo ]] dup * [[ ; immediate : bar 42 foo . ; )

67
samples/Golo/adapters.golo Executable file
View File

@@ -0,0 +1,67 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.Adapters
local function list_sample = |fabric| {
println(">>> list_sample()")
let carbonCopy = list[]
let conf = map[
["extends", "java.util.ArrayList"],
["overrides", map[
["*", |super, name, args| {
if name == "add" {
if args: length() == 2 {
carbonCopy: add(args: get(1))
} else {
carbonCopy: add(args: get(1), args: get(2))
}
}
return super: invokeWithArguments(args)
}
]]
]]
let list = fabric: maker(conf): newInstance()
list: add("bar")
list: add(0, "foo")
list: add("baz")
println(" list: " + list + " " + list: getClass())
println("carbonCopy: " + carbonCopy + " " + carbonCopy: getClass())
}
local function runnable_sample = |fabric| {
println(">>> runnable_sample")
let result = array[1, 2, 3]
let conf = map[
["interfaces", ["java.io.Serializable", "java.lang.Runnable"]],
["implements", map[
["run", |this| {
for (var i = 0, i < result: length(), i = i + 1) {
result: set(i, result: get(i) + 10)
}
}]
]]
]
let runner = fabric: maker(conf): newInstance()
runner: run()
println(" result: " + result: toString())
println("serializable? " + (runner oftype java.io.Serializable.class))
println(" runnable? " + (runner oftype java.lang.Runnable.class))
}
function main = |args| {
let fabric = AdapterFabric()
list_sample(fabric)
runnable_sample(fabric)
}

84
samples/Golo/async.golo Executable file
View File

@@ -0,0 +1,84 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.AsyncHelpers
import gololang.Async
import java.util.concurrent.TimeUnit
import java.util.concurrent.Executors
local function fib = |n| {
if n <= 1 {
return n
} else {
return fib(n - 1) + fib(n - 2)
}
}
function main = |args| {
let executor = newCachedThreadPool()
println("Let's do some useless asynchronous operations...")
var f = executor: enqueue({
Thread.sleep(1000_L)
return 666
})
f:
onSet(|v| -> println(">>> #slow -> " + v)):
onFail(|e| -> println(">>> #fail -> " + e))
f:
cancel(true)
f = executor: enqueue({
Thread.sleep(1000_L)
return 666
})
f:
onSet(|v| -> println(">>> #ok -> " + v)):
onFail(|e| -> println(">>> #wtf? -> " + e))
let fib_10 = promise()
let fib_20 = promise()
let fib_30 = promise()
let fib_40 = promise()
let futures = [
fib_10: future(), fib_20: future(),
fib_30: future(), fib_40: future()
]
executor: submit(-> fib_10: set(fib(10)))
executor: submit(-> fib_20: set(fib(20)))
executor: submit(-> fib_30: set(fib(30)))
executor: submit(-> fib_40: set(fib(40)))
all(futures): onSet(|results| -> println(">>> Fibs: " + results))
let truth = promise()
truth:
future():
map(|v| -> "truth=" + v):
onSet(|v| -> executor: submit(-> println(">>> (another thread) " + v))):
onSet(|v| -> println(">>> (same thread) " + v))
executor: submit({
Thread.sleep(500_L)
truth: set(42)
})
Thread.sleep(1000_L)
executor: shutdown()
executor: awaitTermination(2_L, SECONDS())
println("Bye!")
}

37
samples/Golo/augmentations.golo Executable file
View File

@@ -0,0 +1,37 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.Augmentations
import java.util.LinkedList
augment java.util.List {
function with = |this, value| {
this: add(value)
return this
}
}
augment java.util.Collection {
function doToEach = |this, func| {
foreach (element in this) {
func(element)
}
}
}
function main = |args| {
let list = LinkedList(): with("foo"): with("bar"): with("baz")
list: doToEach(|value| -> println(">>> " + value))
}

43
samples/Golo/closures.golo Executable file
View File

@@ -0,0 +1,43 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module Closures
local function sayHello = |who| -> "Hello " + who + "!"
function main = |args| {
let adder = |a, b| -> a + b
println(adder: invokeWithArguments(1, 2))
println(adder(1, 2))
let addToTen = adder: bindTo(10)
println(addToTen: invokeWithArguments(2))
println(addToTen(2))
let adding = |x| -> |y| -> adder(x, y)
let addingTen = adding(10)
println(addingTen(4))
println(adding(2)(4))
println(sayHello("Julien"))
let list = java.util.LinkedList()
let pump_it = {
list: add("I heard you say")
list: add("Hey!")
list: add("Hey!")
}
pump_it()
println(list)
}

34
samples/Golo/coin-change.golo Executable file
View File

@@ -0,0 +1,34 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module CoinChange
import java.util.LinkedList
function change = |money, coins| -> match {
when money == 0 then 1
when (money < 0) or (coins: isEmpty()) then 0
otherwise change(money - coins: head(), coins) + change(money, coins: tail())
}
function main = |args| {
let coins = LinkedList(): append(1, 2, 5, 10, 20)
println("Coins: " + coins)
println("0: " + change(0, coins))
println("1: " + change(1, coins))
println("2: " + change(2, coins))
println("10: " + change(10, coins))
println("12: " + change(12, coins))
println("6: " + change(6, coins))
}

View File

@@ -0,0 +1,55 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.CollectionLiterals
local function play_with_tuples = {
let hello = ["Hello", "world", "!"]
foreach str in hello {
print(str + " ")
}
println("")
println(hello: get(0) + "-" + hello: get(1) + "-" + hello: get(2))
println(hello: join("/"))
}
local function play_with_literals = {
let data = [
[1, 2, 3],
tuple[1, 2, 3],
array[1, 2, 3],
set[1, 2, 3, 3, 1],
map[
["a", 10],
["b", 20]
],
vector[1, 2, 3],
list[1, 2, 3]
]
data: each(|element| {
println(element: toString())
println(" type: " + element: getClass())
})
}
function main = |args| {
println(">>> Literals")
play_with_literals()
println("\n>>> Tuples")
play_with_tuples()
}

View File

@@ -0,0 +1,53 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.ContextDecorator
import gololang.Decorators
let myContext = defaultContext():
count(0):
define("entry", |this, args| {
this: count(this: count() + 1)
println("hello:" + this: count())
return args
}):
define("exit", |this, result| {
require(result >= 3, "wrong value")
println("goobye")
return result
}):
define("catcher", |this, e| {
println("Caught " + e)
throw e
}):
define("finallizer", |this| {println("do some cleanup")})
@withContext(myContext)
function foo = |a, b| {
println("Hard computation")
return a + b
}
function main = |args| {
println(foo(1,2))
println("====")
println(withContext(myContext)(|a| -> 2*a)(3))
println("====")
try {
println(foo(1, 1))
} catch (e) { }
}

83
samples/Golo/decorators.golo Executable file
View File

@@ -0,0 +1,83 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.Decorators
import java.util.LinkedList
function simple_decorator = |func| {
return |a,b| -> func(a+1,b+1)
}
@simple_decorator
function simple_adder = |x,y| -> x + y
function decorator_with_params = |param1, param2|{
return |func| {
return |a,b| -> func(a+param1,b+param2)
}
}
@decorator_with_params(10,2)
function parametrized_adder = |x,y| -> x + y
function generic_decorator = |func| {
return |args...| {
println("number of params : "+args: length())
return func: invokeWithArguments(args)
}
}
@generic_decorator
function generic_adder0 = -> 42
@generic_decorator
function generic_adder1 = |x| -> x
@generic_decorator
function generic_adder2 = |x,y| -> x + y
@generic_decorator
function generic_adder3 = |x,y,z| -> x + y + z
function list_sum_decorator = |func| {
return |this| -> func(this) - 8
}
augment java.util.List {
@list_sum_decorator
function sum = |this| {
var acc = 0
foreach elem in this {
acc = acc + elem
}
return acc
}
}
function main = |args| {
println(simple_adder(10,30))
println(parametrized_adder(10,20))
println(generic_adder0())
println(generic_adder1(42))
println(generic_adder2(20,22))
println(generic_adder3(10,12,20))
let list = LinkedList()
list: add(5)
list: add(10)
list: add(15)
list: add(20)
println(list: sum())
}

View File

@@ -0,0 +1,88 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.DynamicEvaluation
import gololang.EvaluationEnvironment
local function test_asModule = |env| {
let code =
"""
module foo
function a = -> "a!"
function b = -> "b!"
"""
let mod = env: asModule(code)
let a = fun("a", mod)
let b = fun("b", mod)
println(">>> asModule()")
println(a())
println(b())
}
local function test_anonymousModule = |env| {
let code =
"""
function a = -> "a."
function b = -> "b."
"""
let mod = env: anonymousModule(code)
let a = fun("a", mod)
let b = fun("b", mod)
println(">>> anonymousModule()")
println(a())
println(b())
}
local function test_asFunction = |env| {
let code = "return (a + b) * 2"
let f = env: asFunction(code, "a", "b")
println(">>> asFunction")
println(f(10, 20))
}
local function test_def = |env| {
let code = "|a, b| -> (a + b) * 2"
let f = env: def(code)
println(">>> def")
println(f(10, 20))
}
local function test_run = |env| {
let code = """println(">>> run")
foreach (i in range(0, 3)) {
println("w00t")
}"""
env: run(code)
}
local function test_run_map = |env| {
let code = """println(">>> run_map")
println(a)
println(b)
"""
let values = java.util.TreeMap(): add("a", 1): add("b", 2)
env: run(code, values)
}
function main = |args| {
let env = EvaluationEnvironment()
test_asModule(env)
test_anonymousModule(env)
test_asFunction(env)
test_def(env)
test_run(env)
test_run_map(env)
}

View File

@@ -0,0 +1,29 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.DynamicObjectPerson
local function mrbean = -> DynamicObject():
name("Mr Bean"):
email("mrbean@gmail.com"):
define("toString", |this| -> this: name() + " <" + this: email() + ">")
function main = |args| {
let bean = mrbean()
println(bean: toString())
bean: email("mrbean@outlook.com")
println(bean: toString())
}

34
samples/Golo/echo-args.golo Executable file
View File

@@ -0,0 +1,34 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module EchoArgs
function main = |args| {
println("With a for loop and an index:")
for (var i = 0, i < args: length(), i = i + 1) {
println(" #" + i + " -> " + args: get(i))
}
println("With a foreach loop:")
foreach arg in args {
println(" " + arg)
}
println("With a foreach over a range:")
foreach i in range(0, args: length()) {
println(" #" + i + " -> " + args: get(i))
}
}

View File

@@ -0,0 +1,31 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module sample.EnumsThreadState
import java.lang.Thread$State
function main = |args| {
# Call the enum entry like a function
let new = Thread$State.NEW()
println("name=" + new: name() + ", ordinal=" + new: ordinal())
println("-----------")
# Walk through all enum entries
foreach element in Thread$State.values() {
println("name=" + element: name() + ", ordinal=" + element: ordinal())
}
}

39
samples/Golo/fibonacci.golo Executable file
View File

@@ -0,0 +1,39 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.Fibonacci
import java.lang.System
function fib = |n| {
if n <= 1 {
return n
} else {
return fib(n - 1) + fib(n - 2)
}
}
local function run = {
let start = System.currentTimeMillis()
let result = fib(40)
let duration = System.currentTimeMillis() - start
println(">>> " + result + " (took " + duration + "ms)")
}
function main = |args| {
while true {
run()
}
}

20
samples/Golo/helloworld.golo Executable file
View File

@@ -0,0 +1,20 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module hello.World
function main = |args| {
println("Hello world!")
}

53
samples/Golo/http-server.golo Executable file
View File

@@ -0,0 +1,53 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.WebServer
import java.lang
import java.net.InetSocketAddress
import com.sun.net.httpserver
import com.sun.net.httpserver.HttpServer
function main = |args| {
let server = HttpServer.create(InetSocketAddress("localhost", 8081), 0)
server: createContext("/", |exchange| {
let headers = exchange: getResponseHeaders()
let response = StringBuilder():
append("Requested URI: "):
append(exchange: getRequestURI()):
append("\n"):
append("Current time: "):
append(java.util.Date()):
append("\n"):
toString()
headers: set("Content-Type", "text/plain")
exchange: sendResponseHeaders(200, response: length())
exchange: getResponseBody(): write(response: getBytes())
exchange: close()
})
server: createContext("/shutdown", |exchange| {
let response = "Ok, thanks, bye!"
exchange: getResponseHeaders(): set("Content-Type", "text/plain")
exchange: sendResponseHeaders(200, response: length())
exchange: getResponseBody(): write(response: getBytes())
exchange: close()
server: stop(5)
})
server: start()
println(">>> http://localhost:8081/")
}

65
samples/Golo/logdeco.golo Executable file
View File

@@ -0,0 +1,65 @@
module samples.LogDeco
function log1 = |msg| {
return |fun| {
return |args...| {
println(msg)
return fun: invokeWithArguments(args)
}
}
}
@log1("calling foo")
function foo = |a| {
println("foo got a " + a)
}
@log1("I'am a bar")
function bar = |a| -> 2*a
let sayHello = log1("Hello")
@sayHello
function baz = -> "Goodbye"
function log2 = |msgBefore| -> |msgAfter| -> |func| -> |args...| {
println(msgBefore)
let res = func: invokeWithArguments(args)
println(msgAfter)
return res
}
@log2("enter foo")("exit foo")
function spam = |a| {
println("foo: " + a)
}
function logEnterExit = |name| -> log2("# enter " + name)("# exit " + name)
@logEnterExit("bar")
function egg = { println("doing something...") }
function main = |args| {
foo("bar")
println("---")
println(bar(21))
println("---")
println(baz())
println("---")
spam("bar")
println("---")
egg()
println("---")
let strange_use = log2("hello")("goodbye")({println(":p")})
strange_use()
println("---")
log2("another")("use")(|a|{println(a)})("strange")
}

View File

@@ -0,0 +1,40 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module Matching
import java.util.LinkedList
local function data = {
let list = LinkedList()
list: add("foo@bar.com")
list: add("+33.6.11.22.33")
list: add("http://golo-lang.org/")
list: add("def foo = bar(_._) with :> T")
return list
}
local function what_it_could_be = |item| -> match {
when item: contains("@") then "an email?"
when item: startsWith("+33") then "a French phone number?"
when item: startsWith("http://") then "a website URL?"
otherwise "I have no clue, mate!"
}
function main = |args| {
foreach item in data() {
println(item + " => " + what_it_could_be(item))
}
}

24
samples/Golo/max-int.golo Executable file
View File

@@ -0,0 +1,24 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.MaxInt
local function max_int = {
return java.lang.Integer.MAX_VALUE()
}
function main = |args| {
println(max_int())
}

55
samples/Golo/memoize.golo Executable file
View File

@@ -0,0 +1,55 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.MemoizeDecorator
import gololang.Decorators
import java.lang.System
let memo = memoizer()
@memo
function fib = |n| {
if n <= 1 {
return n
} else {
return fib(n - 1) + fib(n - 2)
}
}
@memo
function foo = |n| -> n
local function run = {
let start = System.currentTimeMillis()
let result = fib(40)
let duration = System.currentTimeMillis() - start
println(">>> fib(40) = " + result + " (took " + duration + "ms)")
}
local function run2 = {
let start = System.currentTimeMillis()
let result = foo(40)
let duration = System.currentTimeMillis() - start
println(">>> foo(40) = " + result + " (took " + duration + "ms)")
}
function main = |args| {
foreach i in range(0, 5) {
println("run " + i)
run()
run2()
}
}

43
samples/Golo/null-safety.golo Executable file
View File

@@ -0,0 +1,43 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module DealingWithNull
import java.util
function main = |args| {
# Data model
let contacts = map[
["mrbean", map[
["email", "bean@gmail.com"],
["url", "http://mrbean.com"]
]],
["larry", map[
["email", "larry@iamricherthanyou.com"]
]]
]
# MrBean and Larry
let mrbean = contacts: get("mrbean")
let larry = contacts: get("larry")
# Illustrates orIfNull
println(mrbean: get("url") orIfNull "n/a")
println(larry: get("url") orIfNull "n/a")
# Querying a non-existent data model because there is no 'address' entry
println(mrbean: get("address")?: street()?: number() orIfNull "n/a")
}

View File

@@ -0,0 +1,65 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.PrepostDecorator
import gololang.Decorators
let isInteger = isOfType(Integer.class)
@checkResult(isString(): andThen(lengthIs(2)))
@checkArguments(isInteger: andThen(isPositive()), isString())
function foo = |a, b| {
return b + a
}
let myCheck = checkArguments(isInteger: andThen(isPositive()))
@myCheck
function inv = |v| -> 1.0 / v
let isPositiveInt = isInteger: andThen(isPositive())
@checkArguments(isPositiveInt)
function mul = |v| -> 10 * v
@checkArguments(isNumber())
function num = |v| -> "ok"
@checkArguments(isNotNull())
function notnull = |v| -> "ok"
function main = |args| {
try { println(foo(1, "b")) } catch (e) { println(e) }
try { println(foo(-1, "b")) } catch (e) { println(e) }
try { println(foo("a", 2)) } catch (e) { println(e) }
try { println(foo(1, 2)) } catch (e) { println(e) }
try { println(foo(10, "ab")) } catch (e) { println(e) }
try { println(inv(10)) } catch (e) { println(e) }
try { println(inv(0)) } catch (e) { println(e) }
try { println(mul(5)) } catch (e) { println(e) }
try { println(mul(0)) } catch (e) { println(e) }
try { println(num(1)) } catch (e) { println(e) }
try { println(num(1_L)) } catch (e) { println(e) }
try { println(num(1.5)) } catch (e) { println(e) }
try { println(num(1.5_F)) } catch (e) { println(e) }
try { println(num("a")) } catch (e) { println(e) }
try { println(num('a')) } catch (e) { println(e) }
try { println(notnull('1')) } catch (e) { println(e) }
try { println(notnull(null)) } catch (e) { println(e) }
}

69
samples/Golo/structs.golo Executable file
View File

@@ -0,0 +1,69 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module StructDemo
struct Point = { x, y }
augment StructDemo.types.Point {
function move = |this, offsetX, offsetY| {
this: x(this: x() + offsetX)
this: y(this: y() + offsetY)
return this
}
function relative = |this, offsetX, offsetY| -> Point(this: x() + offsetX, this: y() + offsetY)
}
function main = |args| {
let p1 = Point(1, 2)
let p2 = Point(): x(1): y(2)
let p3 = p1: frozenCopy()
let p4 = p1: frozenCopy()
println(p1)
println("x = " + p1: x())
println("y = " + p1: y())
println("p1 == p2 " + (p1 == p2))
println("p1 == p3 " + (p1 == p3))
println("p3 == p4 " + (p3 == p4))
println("#p1 " + p1: hashCode())
println("#p2 " + p2: hashCode())
println("#p3 " + p3: hashCode())
println("#p4 " + p4: hashCode())
println("p1: members() " + p1: members())
println("p1: values() " + p1: values())
foreach item in p1 {
println(item: get(0) + " -> " + item: get(1))
}
println("p1: set(\"x\", 10) " + p1: set("x", 10))
println("p1: move(10, 5) " + p1: move(10, 5))
println("p1: relative(11, 6) " + p1: relative(11, 6))
let p5 = ImmutablePoint(10, 20)
println("p5: " + p5)
try {
p5: x(100)
} catch (expected) {
println("p5 is immutable, so... " + expected: getMessage())
}
}

View File

@@ -0,0 +1,43 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.SwingActionListener
import java.awt.event
import javax.swing
import javax.swing.WindowConstants
local function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler)
function main = |args| {
let frame = JFrame("Action listeners")
frame: setDefaultCloseOperation(EXIT_ON_CLOSE())
let button = JButton("Click me!")
button: setFont(button: getFont(): deriveFont(96.0_F))
# Using a helper function
button: addActionListener(listener(|event| -> println("Clicked!")))
# Using a standard augmentation: MethodHandle::to(Class)
button: addActionListener((|event| -> println("[click]")): to(ActionListener.class))
# Straight closure passing
button: addActionListener(|event| -> println("( )"))
frame: getContentPane(): add(button)
frame: pack()
frame: setVisible(true)
}

View File

@@ -0,0 +1,31 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.SwingHelloWorld
import javax.swing
import javax.swing.WindowConstants
function main = |args| {
let frame = JFrame("Hello world")
frame: setDefaultCloseOperation(EXIT_ON_CLOSE())
let label = JLabel("Hello world")
label: setFont(label: getFont(): deriveFont(128.0_F))
frame: getContentPane(): add(label)
frame: pack()
frame: setVisible(true)
}

View File

@@ -0,0 +1,90 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module samples.TemplatesChatWebapp
import java.lang
import java.io
import java.net.InetSocketAddress
import com.sun.net.httpserver
import com.sun.net.httpserver.HttpServer
local function redirect = |exchange, to| {
exchange: getResponseHeaders(): set("Location", to)
exchange: sendResponseHeaders(303, 0)
exchange: close()
}
local function respond = |exchange, body| {
exchange: getResponseHeaders(): set("Content-Type", "text/html")
exchange: sendResponseHeaders(200, body: length())
exchange: getResponseBody(): write(body: getBytes())
exchange: close()
}
# This is leaky and works with just 1 POST parameter...
local function extract_post = |exchange, posts| {
let reader = BufferedReader(InputStreamReader(exchange: getRequestBody()))
var line = reader: readLine()
while line isnt null {
if line: startsWith("msg=") {
posts: add(java.net.URLDecoder.decode(line: substring(4), "UTF-8"))
}
line = reader: readLine()
}
reader: close()
}
local function index = |posts, template, exchange| {
if exchange: getRequestMethod() == "POST" {
extract_post(exchange, posts)
redirect(exchange, "/")
} else {
respond(exchange, template(posts))
}
}
local function index_template = -> """
<%@params posts %>
<!DOCTYPE html>
<html>
<head>
<title>Golo Chat</title>
</head>
<body>
<form action="/" method="post">
<input type="text" name="msg">
<input type="submit" value="Send">
</form>
<div>
<h3>Last posts</h3>
<% foreach post in posts { %>
<div>
<%= post %>
</div>
<% } %>
</div>
</body>
</html>
"""
function main = |args| {
let index_tpl = gololang.TemplateEngine(): compile(index_template())
let posts = java.util.concurrent.ConcurrentLinkedDeque()
let server = HttpServer.create(InetSocketAddress("localhost", 8081), 0)
server: createContext("/", ^index: bindTo(posts): bindTo(index_tpl))
server: start()
println(">>> http://localhost:8081/")
}

View File

@@ -0,0 +1,51 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module MoreCoolContainers
function main = |args| {
println(">>> DynamicVariable")
let dyn = DynamicVariable("Foo")
println(dyn: value())
let t1 = Thread({
dyn: withValue(666, {
println(dyn: value())
})
})
let t2 = Thread({
dyn: withValue(69, {
println(dyn: value())
})
})
t1: start()
t2: start()
t1: join()
t2: join()
println(dyn: value())
println(">>> Observable")
let foo = Observable("Foo")
foo: onChange(|v| -> println("foo = " + v))
let mapped = foo: map(|v| -> v + "!")
mapped: onChange(|v| -> println("mapped = " + v))
foo: set("69")
}

48
samples/Golo/workers.golo Executable file
View File

@@ -0,0 +1,48 @@
# Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
module Workers
import java.lang.Thread
import java.util.concurrent
import gololang.concurrent.workers.WorkerEnvironment
local function pusher = |queue, message| -> queue: offer(message)
local function generator = |port, message| {
foreach i in range(0, 100) {
port: send(message)
}
}
function main = |args| {
let env = WorkerEnvironment.builder(): withFixedThreadPool()
let queue = ConcurrentLinkedQueue()
let pusherPort = env: spawn(^pusher: bindTo(queue))
let generatorPort = env: spawn(^generator: bindTo(pusherPort))
let finishPort = env: spawn(|any| -> env: shutdown())
foreach i in range(0, 10) {
generatorPort: send("[" + i + "]")
}
Thread.sleep(2000_L)
finishPort: send("Die!")
env: awaitTermination(2000)
println(queue: reduce("", |acc, next| -> acc + " " + next))
}

View File

@@ -0,0 +1,21 @@
graph
[
directed 0
node
[
id 0
label "Node 1"
value 100
]
node
[
id 1
label "Node 2"
value 200
]
edge
[
source 1
target 0
]
]

View File

@@ -0,0 +1,50 @@
/*
Huffman Tree DOT graph.
DOT Reference : http://www.graphviz.org/doc/info/lang.html
http://en.wikipedia.org/wiki/DOT_language
Timestamp : 1415989074
Phrase : 'OH GOD WHY IS LINGUIST SO ANAL ABOUT THIS STUFF'
Generated on http://huffman.ooz.ie/
*/
digraph G {
edge [label=0];
graph [ranksep=0];
T [shape=record, label="{{T|4}|000}"];
S [shape=record, label="{{S|5}|001}"];
SPACE [shape=record, label="{{SPACE|9}|01}"];
A [shape=record, label="{{A|3}|1000}"];
H [shape=record, label="{{H|3}|1001}"];
U [shape=record, label="{{U|3}|1010}"];
L [shape=record, label="{{L|2}|10110}"];
N [shape=record, label="{{N|2}|10111}"];
I [shape=record, label="{{I|4}|1100}"];
O [shape=record, label="{{O|4}|1101}"];
G [shape=record, label="{{G|2}|11100}"];
F [shape=record, label="{{F|2}|11101}"];
GF [label=4];
W [shape=record, label="{{W|1}|111100}"];
Y [shape=record, label="{{Y|1}|111101}"];
B [shape=record, label="{{B|1}|111110}"];
D [shape=record, label="{{D|1}|111111}"];
BD [label=2];
WYBD [label=4];
GFWYBD [label=8];
47 -> 18 -> 9 -> T;
29 -> 13 -> 6 -> A;
7 -> U;
4 -> L;
16 -> 8 -> I;
GFWYBD -> GF -> G;
WYBD -> 2 -> W;
BD -> B;9 -> S [label=1];
18 -> SPACE [label=1];
6 -> H [label=1];
13 -> 7 -> 4 -> N [label=1];
8 -> O [label=1];
GF -> F [label=1];
2 -> Y [label=1];
47 -> 29 -> 16 -> GFWYBD -> WYBD -> BD -> D [label=1];
}

View File

@@ -0,0 +1,74 @@
/*
Huffman Tree DOT graph.
DOT Reference : http://www.graphviz.org/doc/info/lang.html
http://en.wikipedia.org/wiki/DOT_language
Timestamp : 1415988139
Phrase : 'SERIAL KILLER AND SEX OFFENDER ANGUS SINCLAIR IS JAILED FOR A MINIMUM OF 37 YEARS FOR THE 1977 WORLDS END MURDERS OF HELEN SCOTT AND CHRISTINE EADIE.'
Generated on http://huffman.ooz.ie/
*/
digraph G {
edge [label=0];
graph [ranksep=0];
node [shape=record];
U [label="{{U|3}|00000}"];
G [label="{{G|1}|0000100}"];
K [label="{{K|1}|0000101}"];
_3 [label="{{3|1}|0000110}"];
_9 [label="{{9|1}|0000111}"];
_39 [label=2];
L [label="{{L|7}|0001}"];
O [label="{{O|7}|0010}"];
Y [label="{{Y|1}|0011000}"];
X [label="{{X|1}|0011001}"];
YX [label=2];
J [label="{{J|1}|0011010}"];
W [label="{{W|1}|0011011}"];
JW [label=2];
YXJW [label=4];
M [label="{{M|4}|00111}"];
E [label="{{E|15}|010}"];
D [label="{{D|8}|0110}"];
T [label="{{T|4}|01110}"];
DOT [label="{{DOT|1}|0111100}"];
_1 [label="{{1|1}|0111101}"];
DOT1 [label=2];
_7 [label="{{7|3}|011111}"];
A [label="{{A|9}|1000}"];
N [label="{{N|9}|1001}"];
S [label="{{S|10}|1010}"];
I [label="{{I|11}|1011}"];
R [label="{{R|11}|1100}"];
C [label="{{C|3}|110100}"];
H [label="{{H|3}|110101}"];
F [label="{{F|6}|11011}"];
SPACE [label="{{SPACE|26}|111}"];
149 -> 61 -> 29 -> 14 -> 7 -> U;
4 -> 2 -> G;
_39 -> _3;
15 -> O;
8 -> YXJW -> YX -> Y;
JW -> J;
32 -> E;
17 -> D;
9 -> T;
5 -> DOT1 -> DOT;
88 -> 39 -> 18 -> A;
21 -> S;
49 -> 23 -> R;
12 -> 6 -> C;2 -> K [label=1];
7 -> 4 -> _39 -> _9 [label=1];
14 -> L [label=1];
YX -> X [label=1];
YXJW -> JW -> W [label=1];
29 -> 15 -> 8 -> M [label=1];
DOT1 -> _1 [label=1];
61 -> 32 -> 17 -> 9 -> 5 -> _7 [label=1];
18 -> N [label=1];
39 -> 21 -> I [label=1];
6 -> H [label=1];
23 -> 12 -> F [label=1];
149 -> 88 -> 49 -> SPACE [label=1];
}

17
samples/HTML/example.xht Normal file
View File

@@ -0,0 +1,17 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>This is a XHTML sample file</title>
<style type="text/css"><![CDATA[
#example {
background-color: yellow;
}
]]></style>
</head>
<body>
<div id="example">
Just a simple <strong>XHTML</strong> test page.
</div>
</body>
</html>

55
samples/Hack/Assert.hh Normal file
View File

@@ -0,0 +1,55 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
final class AssertException extends Exception {}
final class Assert {
public static function isNum(mixed $x): num {
if (is_float($x)) {
return $x;
} else if (is_int($x)) {
return $x;
}
throw new AssertException('Expected an int or float value');
}
public static function isInt(mixed $x): int {
if (is_int($x)) {
return $x;
}
throw new AssertException('Expected an int');
}
public static function isFloat(mixed $x): float {
if (is_float($x)) {
return $x;
}
throw new AssertException('Expected a float');
}
public static function isString(mixed $x): string {
if (is_string($x)) {
return $x;
}
throw new AssertException('Expected a string');
}
// For arrays you need to check every element
public static function isArrayOf<T>(
(function(mixed): T) $fn,
mixed $x,
): array<T> {
if (is_array($x)) {
return array_map($fn, $x);
}
throw new AssertException('Expected an array');
}
}

View File

@@ -0,0 +1,52 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';
require_once "demo.php";
class AssertRecipe extends Recipe implements RecipeWithDemo {
protected function getName(): string {
return 'Assert';
}
<<Override>>
protected function getDescription(): ?string {
return 'When you have values with unknown types, it is useful to make '.
'some runtime assertions and have the type checker understand. This '.
'recipe demonstrates one approach.';
}
protected function getFilenames(): Vector<string> {
return Vector {
'Assert.php',
};
}
protected function getDocs(): Vector<(string, string)> {
return Vector{
tuple ('Mixed Types', 'hack.annotations.mixedtypes'),
tuple ('Type Inference', 'hack.otherrulesandfeatures.typeinference'),
};
}
public function getDemoFilename(): string {
return 'demo.php';
}
public function getDemoResult(): string {
return assert_main();
}
public function getDemoXHP(): ?:xhp {
return null;
}
}

View File

@@ -0,0 +1,39 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/startup/init.php';
abstract class Controller {
protected function __construct() {
startup();
}
abstract protected function getCSS(): Set<string>;
abstract protected function getJS(): Set<string>;
abstract protected function getTitle(): string;
abstract protected function render(): :xhp;
final protected function getHead(): :xhp {
$css = $this->getCSS()->toVector()->map(
($css) ==> <link rel="stylesheet" type="text/css" href={$css} />
);
$js = $this->getJS()->toVector()->map(
($js) ==> <script src={$js} />
);
return
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>
<title>{$this->getTitle()}</title>
{$css->toArray()}
{$js->toArray()}
</head>;
}
}

View File

@@ -0,0 +1,52 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';
require_once "demo.php";
class DBResultRecipe extends Recipe implements RecipeWithDemo {
protected function getName(): string {
return 'DB Result';
}
<<Override>>
protected function getDescription(): ?string {
return 'Fetching data from a DB introduces a few typing challenges. '.
'First, the data comes back untyped. Second, a row in a DB generally '.
'contains columns of different types.';
}
protected function getFilenames(): Vector<string> {
return Vector {
'FakeDB.php',
};
}
protected function getDocs(): Vector<(string, string)> {
return Vector{
tuple ('Hack Shapes', 'hack.shapes'),
tuple ('Mixed Types', 'hack.annotations.mixedtypes'),
};
}
public function getDemoFilename(): string {
return 'demo.php';
}
public function getDemoResult(): string {
return db_result_main();
}
public function getDemoXHP(): ?:xhp {
return null;
}
}

View File

@@ -0,0 +1,22 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';
final class :documentation extends :x:element {
attribute string name;
protected function render(): :xhp {
$name = implode('.', explode(' ', $this->getAttribute('name'))).".php";
$href = "http://hhvm.com/manual/en/$name";
return <a class="docs button" href={$href} target="_blank">docs &rarr;</a>;
}
}

65
samples/Hack/FakeDB.hh Normal file
View File

@@ -0,0 +1,65 @@
<?hh // strict
type DBResultExtra = shape('age' => int);
type DBResult = shape(
'id' => int,
'name' => string,
'extra' => DBResultExtra,
);
final class FakeDB {
public function getRawRows(): array<array<string, mixed>> {
$good_extra = json_encode(array('age' => 40));
$bad_extra = 'corrupt data';
// Real code would query a DB, but for now let's hardcode it
return array(
array(
'id' => 123,
'name' => 'Alice',
'extra' => $good_extra,
),
array(
'id' => 456,
'name' => 'Bob',
'extra' => $bad_extra,
),
);
}
/**
* When processing untyped data you need to check each piece of data and
* figure out whether to give up or recover when the data is bad
*/
public function processRow(array<string, mixed> $row): ?DBResult {
$row = Map::fromArray($row);
$id = $row->contains('id') ? $row['id'] : null;
$name = $row->contains('name') ? $row['name'] : null;
$extra = $row->contains('extra') ? json_decode($row['extra'], true) : null;
// Ignore rows with invalid IDs or names
if (!is_int($id) || !is_string($name)) {
return null;
}
// Try to recover from a bad extra column
if (!is_array($extra)) {
$extra = shape('age' => 0);
} else {
$extra = Map::fromArray($extra);
$extra = shape('age' => $extra->contains('age') ? $extra['age'] : 0);
}
return shape('id' => $id, 'name' => $name, 'extra' => $extra);
}
public function getDBResults(): Vector<DBResult> {
$ret = Vector {};
foreach ($this->getRawRows() as $raw_row) {
$row = $this->processRow($raw_row);
if ($row !== null) {
$ret->add($row);
}
}
return $ret;
}
}

View File

@@ -0,0 +1,72 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';
require_once "demo.php";
class GetAndPostRecipe extends Recipe implements RecipeWithDemo {
protected function getName(): string {
return '$_GET and $_POST';
}
<<Override>>
protected function getDescription(): ?string {
return 'A small example of how to interact with superglobals and the '.
'untyped data they can contain.';
}
protected function getFilenames(): Vector<string> {
return Vector {
'NonStrictFile.php',
'StrictFile.php',
};
}
protected function getDocs(): Vector<(string, string)> {
return Vector {
tuple('invariant()', 'hack.otherrulesandfeatures.invariant'),
};
}
public function getDemoFilename(): string {
return 'demo.php';
}
public function getDemoResult(): string {
return get_and_post_main();
}
public function getDemoXHP(): :xhp {
$url = '/recipes/get-and-post/';
return
<x:frag>
<div>
<a href={"$url?myIntParam=8675309#demo"} class="button">GET myIntParam=8675309</a>
</div>
<div>
<a href={"$url?myIntParam=boom#demo"} class="button">GET myIntParam=boom</a>
</div>
<div>
<form action={"$url#demo"} method="post">
<input type="hidden" name="myIntParam" value="5551234"/>
<input type="submit" class="button" value="POST myIntParam=5551234"/>
</form>
</div>
<div>
<form action={"$url#demo"} method="post">
<input type="hidden" name="myIntParam" value="boom"/>
<input type="submit" class="button" value="POST myIntParam=boom"/>
</form>
</div>
</x:frag>;
}
}

View File

@@ -0,0 +1,30 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
abstract class GetController extends Controller {
final protected function __construct(private Request $request) {
parent::__construct();
}
final protected function getRequest(): Request {
return $this->request;
}
final public function go(array<mixed, mixed> $get): void {
$request = new Request(Map::fromArray($get));
$controller = new static($request);
echo "<!DOCTYPE html>";
$head = $controller->getHead();
$body = $controller->render();
echo (string)$head;
echo (string)$body;
}
}

View File

@@ -0,0 +1,38 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';
class HomeController extends GetController {
use StandardPage;
protected function getTitle(): string {
return 'Hack Cookbook';
}
protected function renderMainColumn(): :xhp {
return <div>
<h1>Cookbook</h1>
<p>
The Hack Cookbook helps you write Hack code by giving you examples of
Hack code. It is written in Hack and is open source. If you
<a href="http://github.com/facebook/hack-example-site">
head over to GitHub,
</a>
you can read the code, check out the repository, and run it
yourself. The recipes in this cookbook are small examples that
illustrate how to use Hack to solve common and interesting problems.
</p>
</div>;
}
}

View File

@@ -0,0 +1,13 @@
<?hh // strict
require_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';
final class MySecureRequest {
public function __construct(private Map<string, mixed> $GETParams) {}
public function stringParam(string $name): UNESCAPED_STRING {
invariant($this->GETParams->contains($name), 'Unknown GET param: '.$name);
$raw_string = $this->GETParams[$name];
invariant(is_string($raw_string), $name.' is not a string');
return unescaped_string($raw_string);
}
}

104
samples/Hack/Nav.hh Normal file
View File

@@ -0,0 +1,104 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';
type NavItem = shape(
'name' => string,
'location' => string,
);
type NavSection = shape(
'name' => string,
'location' => ?string,
'items' => Vector<NavItem>,
);
final class :hack:nav extends :x:element {
private function getNavSections(): Vector<NavSection> {
return Vector{
shape(
'name' => 'Home',
'location' => '/',
'items' => Vector {},
),
shape(
'name' => 'GitHub',
'location' => 'http://github.com/facebook/hack-example-site',
'items' => Vector {},
),
shape(
'name' => 'Recipes',
'location' => null,
'items' => Vector {
shape(
'name' => '$_GET and $_POST',
'location' => '/recipes/get-and-post/',
),
shape(
'name' => 'Assert',
'location' => '/recipes/assert/',
),
shape(
'name' => 'DB Result',
'location' => '/recipes/db-result/',
),
shape(
'name' => 'Unescaped String',
'location' => '/recipes/unescaped-string/',
),
shape(
'name' => 'User ID',
'location' => '/recipes/user-id/',
),
},
),
};
}
private function renderNavItems(Vector<NavItem> $items): :xhp {
$render_item = $item ==>
<li>
<a class="navItem" href={$item['location']}>
{$item['name']}
</a>
</li>;
return
<x:frag>
{$items->map($render_item)->toArray()}
</x:frag>;
}
private function renderNavSection(NavSection $section): :xhp {
$section_item = <h3 class="navItem">{$section['name']}</h3>;
if ($section['location'] !== null) {
$section_item = <a href={$section['location']}>{$section_item}</a>;
}
return
<li class="navSectionItem">
{$section_item}
<ul class="navItems">
{$this->renderNavItems($section['items'])}
</ul>
</li>;
}
public function render(): :xhp {
$sections = $this->getNavSections()
->map($section ==> $this->renderNavSection($section));
return
<div class="nav">
<ul class="navSections">
{$sections->toArray()}
</ul>
</div>;
}
}

View File

@@ -0,0 +1,27 @@
<?hh
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
function getGETParams(): Map<string, mixed> {
// $_GET is not defined in code so Hack doesn't know about it and you can't
// use it in strict mode. You can interact with it outside of strict mode,
// though.
return Map::fromArray($_GET);
}
function getPOSTParams(): Map<string, mixed> {
// Same deal with $_POST and other magically defined globals
return Map::fromArray($_POST);
}
// Same deal with $_SERVER
function isGET(): bool {
return $_SERVER['REQUEST_METHOD'] === 'GET';
}

93
samples/Hack/Recipe.hh Normal file
View File

@@ -0,0 +1,93 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/init.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/standard-page/init.php';
require_once $_SERVER['DOCUMENT_ROOT'].'/core/myxhp/init.php';
abstract class Recipe extends GetController {
use StandardPage;
abstract protected function getName(): string;
abstract protected function getFilenames(): Vector<string>;
abstract protected function getDocs(): Vector<(string, string)>;
protected function getDescription(): ?string {
return null;
}
final protected function getTitle(): string {
return $this->getName().' - Hack Cookbook';
}
final protected function renderMainColumn(): :xhp {
$main_column =
<x:frag>
<h1>{$this->getName()}</h1>
</x:frag>;
$description = $this->getDescription();
if ($description !== null) {
$main_column->appendChild(<p>{$description}</p>);
}
foreach ($this->getFilenames() as $filename) {
$file =
<div class="file">
<div class="filename">{$filename}</div>
<phpfile filename={$filename}/>
</div>;
$main_column->appendChild($file);
}
$recipe = $this;
if ($recipe instanceof RecipeWithDemo) {
try {
$result = $recipe->getDemoResult();
} catch (Exception $e) {
$result = sprintf(
"Demo threw an %s:\n%s",
get_class($e),
$e->getMessage(),
);
}
$result = explode("\n", trim($result));
$result = array_map($x ==> <x:frag>{$x}<br/></x:frag>, $result);
$demo =
<x:frag>
<div class="demo" id="demo">
<h3>Demo</h3>
{$recipe->getDemoXHP()}
<div class="filename">{$recipe->getDemoFilename()}</div>
<phpfile filename={$recipe->getDemoFilename()}/>
<div class="filename">Output</div>
<div class="demoResult">
{$result}
</div>
</div>
</x:frag>;
$main_column->appendChild($demo);
}
if (!$this->getDocs()->isEmpty()) {
$render_doc_link = function($doc) {
list($name, $link) = $doc;
$link = "http://hhvm.com/manual/en/$link.php";
return <li><a href={$link}>{$name}</a></li>;
};
$main_column->appendChild(
<div class="docs">
<h3>Relevant Official Documentation</h3>
<ul>
{$this->getDocs()->map($render_doc_link)->toArray()}
</ul>
</div>
);
}
return $main_column;
}
}

View File

@@ -0,0 +1,16 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
interface RecipeWithDemo {
public function getDemoFilename(): string;
public function getDemoResult(): string;
public function getDemoXHP(): ?:xhp;
}

15
samples/Hack/Request.hh Normal file
View File

@@ -0,0 +1,15 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
final class Request {
public function __construct(private Map<string, mixed> $params) {}
}

View File

@@ -0,0 +1,81 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
trait StandardPage {
require extends Controller;
abstract protected function renderMainColumn(): :xhp;
protected function getExtraCSS(): Set<string> {
return Set {};
}
protected function getExtraJS(): Set<string> {
return Set {};
}
final protected function getCSS(): Set<string> {
return (Set {
'/css/base.css',
})->addAll($this->getExtraCSS());
}
final protected function getJS(): Set<string> {
return (Set {
})->addAll($this->getExtraJS());
}
final private function renderHeader(): :xhp {
return
<div class="hackHeader">
<div class="width">
<a href="http://hacklang.org/">
<div class="logo">Hack</div>
</a>
<div class="headerNav">
<ul>
<li>
<a href="http://hacklang.org/install/">Install</a>
</li>
<li>
<a href="http://hacklang.org/tutorial/">Tutorial</a>
</li>
<li>
<a href="/">Cookbook</a>
</li>
<li>
<a href="http://hhvm.com/manual">Docs</a>
</li>
<li>
<a href="http://github.com/facebook/hhvm">GitHub</a>
</li>
<li>
<a href="http://hhvm.com/">HHVM</a>
</li>
</ul>
</div>
</div>
</div>;
}
final protected function render(): :xhp {
return
<div>
{$this->renderHeader()}
<div class="width">
<div class="mainContainer">
<div class="mainColumn">{$this->renderMainColumn()}</div>
<hack:nav/>
</div>
</div>
</div>;
}
}

View File

@@ -0,0 +1,46 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';
abstract class MyRequest {
abstract public function getParams(): Map<string, mixed>;
// Throws when things go wrong
public function intParamX(string $name): int {
$params = $this->getParams();
invariant($params->contains($name), sprintf('Unknown param: %s', $name));
$param = $params[$name];
invariant(is_numeric($param), sprintf('Param %s is not an int', $name));
return (int)$param;
}
// A lenient version
public function intParam(string $name): ?int {
$params = $this->getParams();
if (!$params->contains($name)) { return null; }
$param = $params[$name];
if (!is_numeric($param)) { return null; }
return (int)$param;
}
}
final class MyGETRequest extends MyRequest {
public function getParams(): Map<string, mixed> {
return getGETParams();
}
}
final class MyPOSTRequest extends MyRequest {
public function getParams(): Map<string, mixed> {
return getPOSTParams();
}
}

View File

@@ -0,0 +1,16 @@
<?hh // strict
// Outside of this file, no one knows that UNESCAPED_STRING is a string
newtype UNESCAPED_STRING = string;
// This is how we initially taint a string.
function unescaped_string(string $s): UNESCAPED_STRING {
return $s;
}
// This is the only thing you can do with an UNESCAPED_STRING (other than pass
// it around)
function escape_unescaped_string(UNESCAPED_STRING $s): string {
// Your use case will decide how you want to escape your strings
return sprintf('Escaped ---> "%s" <--- Escaped', $s);
}

View File

@@ -0,0 +1,59 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';
require_once "demo.php";
class UnescapedStringRecipe extends Recipe implements RecipeWithDemo {
protected function getName(): string {
return 'Unescaped string';
}
<<Override>>
protected function getDescription(): ?string {
return 'Forgetting to properly escape the strings you get from your users '.
'can lead to serious security holes. Hack can help by forcing you to '.
'escape these strings before using them as strings.';
}
protected function getFilenames(): Vector<string> {
return Vector {
'UnescapedString.php',
'MySecureRequest.php',
};
}
protected function getDocs(): Vector<(string, string)> {
return Vector{
tuple('Opaque Type Aliasing', 'hack.typealiasing.opaquetypealiasing'),
};
}
public function getDemoFilename(): string {
return 'demo.php';
}
public function getDemoResult(): string {
return unescaped_string_main();
}
public function getDemoXHP(): ?:xhp {
$url = '/recipes/unescaped-string/';
return
<x:frag>
Try setting the myStrParam GET param to something nice and innocent with this button...
<div>
<a href={"$url?myStrParam='); DROP TABLE important_stuff; --#demo"} class="button">GET myStrParam=Hello world</a>
</div>
</x:frag>;
}
}

33
samples/Hack/UserID.hh Normal file
View File

@@ -0,0 +1,33 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/funs/init.php';
// Outside of this file, no one knows that these types are ints. They do know
// that USER_ID is an ID and COW_ID is an ID
newtype ID = int;
newtype USER_ID as ID = ID;
newtype COW_ID as ID = ID;
function assert_user_id(int $x): USER_ID {
// Everyone knows all user ids are odd
invariant($x % 2, sprintf('Invalid user ID: %d', $x));
return $x;
}
function assert_cow_id(int $x): COW_ID {
// Everyone knows all cow ids are even
invariant($x % 2 === 0, sprintf('Invalid cow ID: %d', $x));
return $x;
}
function id_to_int(ID $id): int {
return $id;
}

View File

@@ -0,0 +1,54 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/core/controller/recipe/init.php';
require_once "demo.php";
class UserIDRecipe extends Recipe implements RecipeWithDemo {
protected function getName(): string {
return 'User ID';
}
<<Override>>
protected function getDescription(): ?string {
return 'Protect your user IDs from being confused with normal ints';
}
protected function getFilenames(): Vector<string> {
return Vector {
'UserID.php',
'UsingUserID.php',
};
}
protected function getDocs(): Vector<(string, string)> {
return Vector {
tuple('Opaque Type Aliasing', 'hack.typealiasing.opaquetypealiasing'),
tuple(
'Opaque Type Aliasing with Constraints',
'hack.typealiasing.opaquewithconstraints',
),
};
}
public function getDemoFilename(): string {
return 'demo.php';
}
public function getDemoResult(): string {
return user_id_main();
}
public function getDemoXHP(): ?:xhp {
return null;
}
}

View File

@@ -0,0 +1,22 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
function get_something_string(ID $id, string $something): string {
return sprintf("Awesome %s #%d\n", $something, id_to_int($id));
}
function get_user_string(USER_ID $id): string {
return get_something_string($id, 'user');
}
function get_cow_string(COW_ID $id): string {
return get_something_string($id, 'cow');
}

43
samples/Hack/error.hh Normal file
View File

@@ -0,0 +1,43 @@
<?hh
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
final class TypehintViolationException extends Exception {
}
function setup_errors(): void {
set_error_handler('handle_error', E_ALL);
}
/**
* I want to turn failed typehints into exceptions so that I can handle them in
* my example code
*/
function handle_error(
$errno,
$errstr,
$errfile,
$errline,
$errcontext = array(),
$errtrace = array(),
): bool {
if (E_RECOVERABLE_ERROR == $errno) {
// Transform typehint failures into an exception.
if (strpos($errstr, 'must be an instance of ') !== false) {
throw new TypehintViolationException($errstr);
}
// Transform nullable type violations to exceptions.
if ((strpos($errstr, 'must be of type ?') !== false) &&
(strpos($errstr, 'Value returned from') === false)) {
throw new TypehintViolationException($errstr);
}
}
return false;
}

32
samples/Hack/funs.hh Normal file
View File

@@ -0,0 +1,32 @@
<?hh
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
/**
* This file contains a bunch of php stubs for functions that have been added
* to hhvm (though aren't in a release yet). These are important because the
* Hack typechecker can understand them
*/
class InvariantViolationException extends Exception {}
function invariant(mixed $test, string $message): void {
if (!$test) {
invariant_violation($message);
}
}
function invariant_violation(string $message): void {
throw new InvariantViolationException($message);
}
function class_meth(string $class, string $method) {
return array($class, $method);
}

32
samples/Hack/funs.php Normal file
View File

@@ -0,0 +1,32 @@
<?hh
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
/**
* This file contains a bunch of php stubs for functions that have been added
* to hhvm (though aren't in a release yet). These are important because the
* Hack typechecker can understand them
*/
class InvariantViolationException extends Exception {}
function invariant(mixed $test, string $message): void {
if (!$test) {
invariant_violation($message);
}
}
function invariant_violation(string $message): void {
throw new InvariantViolationException($message);
}
function class_meth(string $class, string $method) {
return array($class, $method);
}

14
samples/Hack/index.hh Normal file
View File

@@ -0,0 +1,14 @@
<?hh
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once 'HomeController.php';
HomeController::go($_GET);

31
samples/Hack/phpfile.hh Normal file
View File

@@ -0,0 +1,31 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
require_once $_SERVER['DOCUMENT_ROOT'].'/vendor/hhvm/xhp/src/init.php';
final class :phpfile extends :x:primitive {
category %flow;
attribute string filename;
/**
* Ok, I'll admit this is kind of gross. I don't really want to implement
* syntax highlighting, so I'm relying on the built-in PHP support. XHP
* makes html strings sort of difficult to use (which is good cause they're
* dangerous). Anyway, this is one way around it :)
*/
protected function stringify(): string {
return
'<div class="code">'.
(string)highlight_file($this->getAttribute('filename'), /*ret*/ true).
'</div>';
}
}

14
samples/Hack/startup.hh Normal file
View File

@@ -0,0 +1,14 @@
<?hh // strict
/**
* Copyright (c) 2014, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*
*/
function startup(): void {
setup_errors();
}

View File

@@ -1,3 +0,0 @@
(function() {
}).call(this);

View File

@@ -0,0 +1,795 @@
HAI 1.3
OBTW
Author: Logan Kelly (logan.kelly@gmail.com)
Github: https://github.com/LoganKelly/LOLTracer
TLDR
OBTW prev is the number used in the randin function.
I had to declare it in global scope so that it
would retain its value between calls to randin.
TLDR
I HAS A prev ITZ 0
I HAS A rand_max ITZ 104729
OBTW Equivalent to C's rand() function, except returns
a number in the range of 0 to rand_max.
TLDR
HOW IZ I randin
I HAS A a ITZ 33083
I HAS A c ITZ 67607
prev R MOD OF SUM OF PRODUKT OF prev AN a AN c AN rand_max
FOUND YR prev
IF U SAY SO
BTW Returns a random number within the range of 0-1.
HOW IZ I rand_onein
I HAS A rand_num ITZ I IZ randin MKAY
rand_num IS NOW A NUMBAR
I HAS A rand_max_float ITZ MAEK rand_max A NUMBAR
FOUND YR QUOSHUNT OF rand_num AN rand_max_float
IF U SAY SO
OBTW Equivalent to C ceil() function. Returns the next
largest integer for the given number.
TLDR
HOW IZ I ceilin YR num
I HAS A int_num ITZ num
int_num IS NOW A NUMBR
BOTH SAEM int_num AN num, O RLY?
YA RLY, FOUND YR num
OIC
DIFFRINT num AN SMALLR OF num AN 0, O RLY?
YA RLY
int_num R SUM OF int_num AN 1
FOUND YR MAEK int_num A NUMBAR
OIC
DIFFRINT num AN BIGGR OF num AN 0, O RLY?
YA RLY
FOUND YR MAEK int_num A NUMBAR
OIC
IF U SAY SO
OBTW Convert a number to hexadecimal. This
is returned as a string.
TLDR
HOW IZ I decimal_to_hex YR num
I HAS A i ITZ 0
I HAS A rem
I HAS A hex_num ITZ A BUKKIT
I HAS A decimal_num ITZ num
IM IN YR num_loop
rem R MOD OF decimal_num AN 16
I HAS A hex_digit
rem, WTF?
OMG 10, hex_digit R "A", GTFO
OMG 11, hex_digit R "B", GTFO
OMG 12, hex_digit R "C", GTFO
OMG 13, hex_digit R "D", GTFO
OMG 14, hex_digit R "E", GTFO
OMG 15, hex_digit R "F", GTFO
OMGWTF, hex_digit R rem
OIC
hex_num HAS A SRS i ITZ hex_digit
decimal_num R QUOSHUNT OF decimal_num AN 16
BOTH SAEM decimal_num AN 0, O RLY?
YA RLY, GTFO
NO WAI, i R SUM OF i AN 1
OIC
IM OUTTA YR num_loop
I HAS A hex_string ITZ A YARN
IM IN YR string_reverse
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
YA RLY, GTFO
OIC
hex_string R SMOOSH hex_string AN hex_num'Z SRS i MKAY
i R DIFF OF i AN 1
IM OUTTA YR string_reverse
FOUND YR hex_string
IF U SAY SO
OBTW Convert a number to binary. This is returned
as a bukkit which has slots number 0-N where
n is equal to the number of binary digits - 1.
It also has a length slot which is equal to
the number of binary digits.
TLDR
HOW IZ I decimal_to_binary YR num
I HAS A i ITZ 0
I HAS A decimal_num ITZ num
I HAS A binary_num ITZ A BUKKIT
IM IN YR num_loop
binary_num HAS A SRS i ITZ MOD OF decimal_num AN 2
decimal_num R QUOSHUNT OF decimal_num AN 2
BOTH SAEM decimal_num AN 0, O RLY?
YA RLY
I HAS A length ITZ SUM OF i AN 1
binary_num HAS A length ITZ length
GTFO
NO WAI, i R SUM OF i AN 1
OIC
IM OUTTA YR num_loop
FOUND YR binary_num
IF U SAY SO
OBTW Bitwise and two binary numbers. The numbers
must be provided in the format returned by
decimal_to_binary.
TLDR
HOW IZ I bitwise_andin YR first_num AN YR second_num
I HAS A binary_first_num ITZ I IZ decimal_to_binary YR first_num MKAY
I HAS A binary_second_num ITZ I IZ decimal_to_binary YR second_num MKAY
I HAS A first_length ITZ binary_first_num'Z length
I HAS A second_length ITZ binary_second_num'Z length
I HAS A max_length ITZ BIGGR OF first_length AN second_length
I HAS A final_binary ITZ A BUKKIT
I HAS A final_length ITZ 0
I HAS A i ITZ 0
IM IN YR num_loop
BOTH SAEM i AN max_length, O RLY?
YA RLY, GTFO
OIC
I HAS A first_binary ITZ 0
I HAS A second_binary ITZ 0
DIFFRINT i AN BIGGR OF i AN first_length, O RLY?
YA RLY, first_binary R binary_first_num'Z SRS i
OIC
DIFFRINT i AN BIGGR OF i AN second_length, O RLY?
YA RLY, second_binary R binary_second_num'Z SRS i
OIC
EITHER OF BOTH SAEM first_binary AN 0 AN ...
BOTH SAEM second_binary AN 0, O RLY?
YA RLY, final_binary HAS A SRS i ITZ 0
NO WAI
final_binary HAS A SRS i ITZ 1
final_length R SUM OF i AN 1
OIC
i R SUM OF i AN 1
IM OUTTA YR num_loop
final_binary HAS A length ITZ final_length
FOUND YR final_binary
IF U SAY SO
OBTW Bitshift left a binary number by num_bits.
The binary number must be provided in the format
returned by decimal_to_binary.
TLDR
HOW IZ I bit_shift_leftin YR num AN YR num_bits
I HAS A binary_num ITZ num
I HAS A length ITZ binary_num'Z length
I HAS A i ITZ SUM OF DIFF OF length AN 1 AN num_bits
I HAS A shifted_binary_num ITZ A BUKKIT
IM IN YR num_loop
BOTH SAEM i AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A unshifted_index ITZ DIFF OF i AN num_bits
BOTH SAEM unshifted_index AN BIGGR OF unshifted_index AN 0, O RLY?
YA RLY
shifted_binary_num HAS A SRS i ITZ binary_num'Z SRS unshifted_index
NO WAI
shifted_binary_num HAS A SRS i ITZ 0
OIC
i R DIFF OF i AN 1
IM OUTTA YR num_loop
shifted_binary_num HAS A length ITZ SUM OF binary_num'Z length AN num_bits
FOUND YR shifted_binary_num
IF U SAY SO
OBTW Convert a binary number into a decimal number.
The binary number must be provided in the format
return by decimal_to_binary.
TLDR
HOW IZ I binary_to_decimal YR binary_num
I HAS A length ITZ binary_num'Z length
I HAS A decimal_num ITZ 0
I HAS A i ITZ 0
IM IN YR num_loop
BOTH SAEM i AN length, O RLY?
YA RLY, GTFO
OIC
I HAS A binary_value ITZ binary_num'Z SRS i
I HAS A decimal_value ITZ 0
BOTH SAEM binary_value AN 1, O RLY?
YA RLY, decimal_value R I IZ power_of YR 2 AN YR i MKAY
OIC
decimal_num R SUM OF decimal_num AN decimal_value
i R SUM OF i AN 1
IM OUTTA YR num_loop
FOUND YR decimal_num
IF U SAY SO
OBTW Equivalent to C's pow() function. Raises
base to the power of exponent.
TLDR
HOW IZ I power_of YR base AN YR exponent
I HAS A i ITZ 0
I HAS A num ITZ 1
IM IN YR num_loop
BOTH SAEM i AN exponent, O RLY?
YA RLY, GTFO
OIC
num R PRODUKT OF num AN base
i R SUM OF i AN 1
IM OUTTA YR num_loop
FOUND YR num
IF U SAY SO
OBTW Return a binary number as a YARN.
The binary number must be provided in the format
return by decimal_to_binary.
TLDR
HOW IZ I binary_to_string YR binary_num
I HAS A binary_string ITZ A YARN
I HAS A i ITZ DIFF OF binary_num'Z length AN 1
IM IN YR string_reverse
DIFFRINT i AN BIGGR OF i AN 0, O RLY?
YA RLY, GTFO
OIC
binary_string R SMOOSH binary_string AN binary_num'Z SRS i MKAY
i R DIFF OF i AN 1
IM OUTTA YR string_reverse
FOUND YR binary_string
IF U SAY SO
OBTW Converts a hexadecimal number to the character
equivalent in UNICODE. This was originally used
in an attempt to write out to the P6 format of PPM,
but the string produced by VISIBLE didn't seem to be
properly formatted for some reason. Instead I fell back
to P3 of PPM and wrote out to regular ascii format.
TLDR
HOW IZ I hex_to_char YR hex_string
OBTW This is a hack I found for converting hexadecimal strings
into their unicode character equivalents. Instead of using
the ":" character directly, we escape it and get it using its
unicode hex value (3A). This allows us to assemble the string
with our inserted hex value without errors.
TLDR
FOUND YR SMOOSH ":(3A)" AN "(" AN hex_string AN ")" MKAY
IF U SAY SO
OBTW Equivalent to C's square() function. However it will only
produce accurate results if the number is no larger than
1048576. See the note below. This is based upon Newton's
Approximation Method as adapted in C at this website (#11):
http://www.codeproject.com/Articles/69941/Best-Square-Root-Method-Algorithm-Function-Precisi
TLDR
HOW IZ I square_rootin YR number
OBTW Forcing a comparison between the accuracy and a number
which is so big that its precision is larger than the
accuracy causes an infinite loop to occur. For this
reason we have to set any number larger than 2^20 to
a value below it.
TLDR
BOTH SAEM number AN BIGGR OF number AN 1048576.00, O RLY?
YA RLY, number R 1048575.00
OIC
I HAS A accuracy ITZ 0.0001
I HAS A lower ITZ A NUMBAR
I HAS A upper ITZ A NUMBAR
I HAS A guess ITZ A NUMBAR
DIFFRINT number AN BIGGR OF number AN 1.0, O RLY?
YA RLY
lower R number
upper R 1.0
NO WAI
lower R 1.0
upper R number
OIC
IM IN YR LOOP
I HAS A delta ITZ DIFF OF upper AN lower
BOTH SAEM delta AN SMALLR OF delta AN accuracy, O RLY?
YA RLY, GTFO
OIC
I HAS A guess ITZ QUOSHUNT OF SUM OF lower AN upper AN 2.0
I HAS A guess_squared ITZ PRODUKT OF guess AN guess
DIFFRINT guess_squared AN SMALLR OF guess_squared AN number, O RLY?
YA RLY
upper R guess
NO WAI
lower R guess
OIC
IM OUTTA YR LOOP
FOUND YR QUOSHUNT OF SUM OF lower AN upper AN 2.0
IF U SAY SO
OBTW
The intersection test for line [o, d]
Return 2 if a hit was found (and also return distance t and bouncing ray n).
Return 0 if no hit was found but ray goes upward
Return 1 if no hit was found but ray goes downward
TLDR
HOW IZ I tracin YR o AN YR d
I HAS A t ITZ 1000000000
I HAS A m ITZ 0
BOTH SAEM d'Z z AN 0, O RLY?
YA RLY, d'Z z R 0.00001
OIC
I HAS A p ITZ QUOSHUNT OF DIFF OF 0 AN o'Z z AN d'Z z
I HAS A n ITZ LIEK A Vector
DIFFRINT p AN SMALLR OF p AN 0.01, O RLY?
YA RLY
t R p
n R Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
m R 1
OIC
BTW The world is encoded in sphere_positions, with 9 lines and 19 columns
I HAS A k ITZ 18
IM IN YR column_loop BTW For each column of objects
BOTH SAEM k AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A j ITZ 8
IM IN YR line_loop BTW For each line on that column
BOTH SAEM j AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A sphere_positions_line ITZ sphere_positions'Z SRS j
sphere_positions_line'Z SRS k, O RLY?
YA RLY
BTW There is a sphere, but does the ray hit it?
p R Vector IZ addin YR o AN YR ...
Vector IZ constructin YR DIFF OF 0 AN k AN ...
YR 0 AN ...
YR DIFF OF DIFF OF 0 AN j AN 4 MKAY ...
MKAY
I HAS A b ITZ Vector IZ dot_productin YR p AN YR d MKAY
I HAS A q_c ITZ DIFF OF Vector IZ dot_productin YR p AN YR p MKAY AN 1
I HAS A q ITZ DIFF OF PRODUKT OF b AN b AN q_c
DIFFRINT q AN SMALLR OF q AN 0, O RLY?
YA RLY
BTW It does, compute the distance camera-sphere
I HAS A s ITZ DIFF OF DIFF OF 0 AN b AN I IZ square_rootin YR q MKAY
BOTH OF DIFFRINT s AN BIGGR OF s AN t AN ...
DIFFRINT s AN SMALLR OF s AN 0.01, O RLY?
YA RLY
BTW So far this is the minimum distance, save it. And
BTW also compute the bouncing ray vector into 'n'
t R s
I HAS A bouncing_ray ITZ Vector IZ scalin YR direction AN YR t MKAY
bouncing_ray R Vector IZ addin YR p AN YR bouncing_ray MKAY
n R Vector IZ normalizin YR bouncing_ray MKAY
m R 2
OIC
OIC
OIC
j R DIFF OF j AN 1
IM OUTTA YR line_loop
k R DIFF OF k AN 1
IM OUTTA YR column_loop
I HAS A result ITZ A BUKKIT
result HAS A m ITZ m
result HAS A t ITZ t
result HAS A n ITZ n
FOUND YR result
IF U SAY SO
OBTW
Sample the world and return the pixel color for
a ray [o, d]
TLDR
HOW IZ I samplin YR o AN YR d
BTW Search for an intersection ray Vs. world
I HAS A result ITZ I IZ tracin YR o AN YR d MKAY
I HAS A m ITZ result'Z m
I HAS A t ITZ result'Z t
I HAS A n ITZ result'Z n
BOTH SAEM m AN 0, O RLY?
YA RLY
BTW No sphere found and the ray goes upward: Generate a sky color
I HAS A vec_result ITZ Vector IZ constructin YR 0.7 AN YR 0.6 AN YR 1.0 MKAY
I HAS A z_component ITZ d'Z z
DIFFRINT z_component AN BIGGR OF z_component AN 0, O RLY?
YA RLY, z_component R 0
OIC
I HAS A vec_num ITZ DIFF OF 1 AN z_component
vec_num R I IZ power_of YR vec_num AN YR 4 MKAY
FOUND YR Vector IZ scalin YR vec_result AN YR vec_num MKAY
OIC
BTW h = intersection coordinate
I HAS A h ITZ Vector IZ scalin YR d AN YR t MKAY
h R Vector IZ addin YR o AN YR h MKAY
BTW l = direction to light (with random delta for soft shadows)
I HAS A l ITZ LIEK A Vector
l HAS A x ITZ SUM OF 9 AN I IZ rand_onein MKAY
l HAS A y ITZ SUM OF 9 AN I IZ rand_onein MKAY
l HAS A z ITZ 16
I HAS A l_two ITZ Vector IZ scalin YR h AN YR -1.0 MKAY
l R Vector IZ addin YR l AN YR l_two MKAY
l R Vector IZ normalizin YR l MKAY
BTW r = The half-vector
I HAS A r ITZ Vector IZ dot_productin YR n AN YR d MKAY
r R PRODUKT OF r AN -2
r R Vector IZ scalin YR n AN YR r MKAY
r R Vector IZ addin YR d AN YR r MKAY
BTW Calculate the lambertian factor
I HAS A b ITZ Vector IZ dot_productin YR l AN YR n MKAY
BTW Calculate illumination factor (lambertian coefficient > 0 or in shadow)?
I HAS A illumination_result ITZ I IZ tracin YR h AN YR l MKAY
I HAS A i_m ITZ illumination_result'Z m
EITHER OF DIFFRINT b AN BIGGR OF b AN 0 AN BOTH SAEM i_m AN 2, O RLY?
YA RLY, b R 0
OIC
BTW Calculate the color 'p' with diffuse and specular component
I HAS A base
DIFFRINT b AN SMALLR OF b AN 0, O RLY?
YA RLY, base R 1
NO WAI, base R 0
OIC
base R Vector IZ scalin YR r AN YR base MKAY
base R Vector IZ dot_productin YR l AN YR r MKAY
I HAS A p ITZ I IZ power_of YR base AN YR 99 MKAY
BOTH SAEM m AN 1, O RLY?
YA RLY
BTW No sphere was hit and the ray was going downward: Generate a floor color
h R Vector IZ scalin YR h AN YR 0.2 MKAY
I HAS A ceil_h_x ITZ I IZ ceilin YR h'Z x MKAY
I HAS A ceil_h_y ITZ I IZ ceilin YR h'Z y MKAY
I HAS A ceil_h ITZ SUM OF ceil_h_x AN ceil_h_y
ceil_h IS NOW A NUMBR
I HAS A color_choice ITZ MOD OF ceil_h AN 2
I HAS A color ITZ LIEK A Vector
color_choice, O RLY?
YA RLY
color HAS A x ITZ 3
color HAS A y ITZ 1
color HAS A z ITZ 1
NO WAI
color HAS A x ITZ 3
color HAS A y ITZ 3
color HAS A z ITZ 3
OIC
FOUND YR Vector IZ scalin YR color AN YR SUM OF PRODUKT OF b AN 0.2 AN 0.1 MKAY
OIC
BTW m == 2 A sphere was hit. Cast a ray bouncing from the sphere surface.
I HAS A sphere_color ITZ LIEK A Vector
sphere_color HAS A x ITZ p
sphere_color HAS A y ITZ p
sphere_color HAS A z ITZ p
I HAS A recursive_color ITZ I IZ samplin YR h AN YR r MKAY
BTW Attenuate color by 50% since it is bouncing (* .5)
recursive_color R Vector IZ scalin YR recursive_color AN YR 0.5 MKAY
FOUND YR Vector IZ addin YR sphere_color AN YR recursive_color MKAY
IF U SAY SO
OBTW The vector class provides functionality for all the common
linear algebra operations performed on vectors.
TLDR
O HAI IM Vector
I HAS A x ITZ 0
I HAS A y ITZ 0
I HAS A z ITZ 0
BTW Add vector_one and vector_two
HOW IZ I addin YR vector_one AN YR vector_two
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R SUM OF vector_one'Z x AN vector_two'Z x
result'Z y R SUM OF vector_one'Z y AN vector_two'Z y
result'Z z R SUM OF vector_one'Z z AN vector_two'Z z
FOUND YR result
IF U SAY SO
BTW Scale vector_one by value
HOW IZ I scalin YR vector_one AN YR value
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R PRODUKT OF vector_one'Z x AN value
result'Z y R PRODUKT OF vector_one'Z y AN value
result'Z z R PRODUKT OF vector_one'Z z AN value
FOUND YR result
IF U SAY SO
BTW Dot product of vector_one and vector_two
HOW IZ I dot_productin YR vector_one AN YR vector_two
FOUND YR SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_two'Z x AN ...
PRODUKT OF vector_one'Z y AN vector_two'Z y AN ...
PRODUKT OF vector_one'Z z AN vector_two'Z z
IF U SAY SO
BTW Cross product of vector_one and vector_two
HOW IZ I cross_productin YR vector_one AN YR vector_two
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
result'Z x R DIFF OF PRODUKT OF vector_one'Z y AN vector_two'Z z AN ...
PRODUKT OF vector_one'Z z AN vector_two'Z y
result'Z y R DIFF OF PRODUKT OF vector_one'Z z AN vector_two'Z x AN ...
PRODUKT OF vector_one'Z x AN vector_two'Z z
result'Z z R DIFF OF PRODUKT OF vector_one'Z x AN vector_two'Z y AN ...
PRODUKT OF vector_one'Z y AN vector_two'Z x
FOUND YR result
IF U SAY SO
BTW Length of vector_one
HOW IZ I lengthin YR vector_one
FOUND YR I IZ square_rootin YR ...
SUM OF SUM OF PRODUKT OF vector_one'Z x AN vector_one'Z x AN ...
PRODUKT OF vector_one'Z y AN vector_one'Z y AN ...
PRODUKT OF vector_one'Z z AN vector_one'Z z MKAY
IF U SAY SO
BTW Normalize vector_one
HOW IZ I normalizin YR vector_one
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ 0
result HAS A y ITZ 0
result HAS A z ITZ 0
I HAS A length ITZ Vector IZ lengthin YR vector_one MKAY
BOTH SAEM length AN 0, O RLY?
YA RLY
length R 1
OIC
result'Z x R QUOSHUNT OF vector_one'Z x AN length
result'Z y R QUOSHUNT OF vector_one'Z y AN length
result'Z z R QUOSHUNT OF vector_one'Z z AN length
FOUND YR result
IF U SAY SO
BTW Printable YARN version of vector
HOW IZ I to_stringin YR vector
FOUND YR SMOOSH "[" AN vector'Z x AN ", " ...
AN vector'Z y AN ", " ...
AN vector'Z z AN "]" MKAY
IF U SAY SO
BTW Create and return a vector with components x, y, and z
HOW IZ I constructin YR x AN YR y AN YR z
I HAS A result ITZ LIEK A Vector
result HAS A x ITZ x
result HAS A y ITZ y
result HAS A z ITZ z
FOUND YR result
IF U SAY SO
KTHX
OBTW The positions of the spheres are essentially
stored in a 2-D array. This differs from Kensler's
version where he used bit flags to store the
positions in a compressed and quickly accessed
manner. Unfortunately for us, bit operations
in LOLCODE were too slow for this to be a tenable
solution.
TLDR
I HAS A sphere_positions ITZ A BUKKIT
I HAS A sphere_positions_0 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_0 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 0 ITZ sphere_positions_0
I HAS A sphere_positions_1 ITZ A BUKKIT
sphere_positions_1 HAS A SRS 0 ITZ WIN
BTW sphere_positions_1 HAS A SRS 0 ITZ FAIL
sphere_positions_1 HAS A SRS 1 ITZ FAIL
sphere_positions_1 HAS A SRS 2 ITZ WIN
BTW sphere_positions_1 HAS A SRS 2 ITZ FAIL
sphere_positions_1 HAS A SRS 3 ITZ FAIL
sphere_positions_1 HAS A SRS 4 ITZ WIN
BTW sphere_positions_1 HAS A SRS 4 ITZ FAIL
sphere_positions_1 HAS A SRS 5 ITZ FAIL
sphere_positions_1 HAS A SRS 6 ITZ FAIL
sphere_positions_1 HAS A SRS 7 ITZ WIN
BTW sphere_positions_1 HAS A SRS 7 ITZ FAIL
sphere_positions_1 HAS A SRS 8 ITZ FAIL
sphere_positions_1 HAS A SRS 9 ITZ WIN
BTW sphere_positions_1 HAS A SRS 9 ITZ FAIL
sphere_positions_1 HAS A SRS 10 ITZ FAIL
sphere_positions_1 HAS A SRS 11 ITZ WIN
BTW sphere_positions_1 HAS A SRS 11 ITZ FAIL
sphere_positions_1 HAS A SRS 12 ITZ FAIL
sphere_positions_1 HAS A SRS 13 ITZ FAIL
sphere_positions_1 HAS A SRS 14 ITZ WIN
BTWsphere_positions_1 HAS A SRS 14 ITZ FAIL
sphere_positions_1 HAS A SRS 15 ITZ FAIL
sphere_positions_1 HAS A SRS 16 ITZ WIN
BTW sphere_positions_1 HAS A SRS 16 ITZ FAIL
sphere_positions_1 HAS A SRS 17 ITZ FAIL
sphere_positions_1 HAS A SRS 18 ITZ WIN
BTW sphere_positions_1 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 1 ITZ sphere_positions_1
I HAS A sphere_positions_2 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_2 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 2 ITZ sphere_positions_2
I HAS A sphere_positions_3 ITZ A BUKKIT
sphere_positions_3 HAS A SRS 0 ITZ FAIL
sphere_positions_3 HAS A SRS 1 ITZ FAIL
sphere_positions_3 HAS A SRS 2 ITZ FAIL
sphere_positions_3 HAS A SRS 3 ITZ FAIL
sphere_positions_3 HAS A SRS 4 ITZ WIN
BTW sphere_positions_3 HAS A SRS 4 ITZ FAIL
sphere_positions_3 HAS A SRS 5 ITZ FAIL
sphere_positions_3 HAS A SRS 6 ITZ FAIL
sphere_positions_3 HAS A SRS 7 ITZ WIN
BTW sphere_positions_3 HAS A SRS 7 ITZ FAIL
sphere_positions_3 HAS A SRS 8 ITZ FAIL
sphere_positions_3 HAS A SRS 9 ITZ FAIL
sphere_positions_3 HAS A SRS 10 ITZ FAIL
sphere_positions_3 HAS A SRS 11 ITZ WIN
sphere_positions_3 HAS A SRS 12 ITZ FAIL
sphere_positions_3 HAS A SRS 13 ITZ FAIL
sphere_positions_3 HAS A SRS 14 ITZ FAIL
sphere_positions_3 HAS A SRS 15 ITZ FAIL
sphere_positions_3 HAS A SRS 16 ITZ FAIL
sphere_positions_3 HAS A SRS 17 ITZ FAIL
sphere_positions_3 HAS A SRS 18 ITZ WIN
BTW sphere_positions_3 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 3 ITZ sphere_positions_3
I HAS A sphere_positions_4 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_4 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 4 ITZ sphere_positions_4
I HAS A sphere_positions_5 ITZ A BUKKIT
sphere_positions_5 HAS A SRS 0 ITZ FAIL
sphere_positions_5 HAS A SRS 1 ITZ FAIL
sphere_positions_5 HAS A SRS 2 ITZ FAIL
sphere_positions_5 HAS A SRS 3 ITZ FAIL
sphere_positions_5 HAS A SRS 4 ITZ WIN
BTW sphere_positions_5 HAS A SRS 4 ITZ FAIL
sphere_positions_5 HAS A SRS 5 ITZ FAIL
sphere_positions_5 HAS A SRS 6 ITZ FAIL
sphere_positions_5 HAS A SRS 7 ITZ WIN
BTW sphere_positions_5 HAS A SRS 7 ITZ FAIL
sphere_positions_5 HAS A SRS 8 ITZ FAIL
sphere_positions_5 HAS A SRS 9 ITZ WIN
BTW sphere_positions_5 HAS A SRS 9 ITZ FAIL
sphere_positions_5 HAS A SRS 10 ITZ FAIL
sphere_positions_5 HAS A SRS 11 ITZ WIN
BTW sphere_positions_5 HAS A SRS 11 ITZ FAIL
sphere_positions_5 HAS A SRS 12 ITZ FAIL
sphere_positions_5 HAS A SRS 13 ITZ FAIL
sphere_positions_5 HAS A SRS 14 ITZ FAIL
sphere_positions_5 HAS A SRS 15 ITZ FAIL
sphere_positions_5 HAS A SRS 16 ITZ FAIL
sphere_positions_5 HAS A SRS 17 ITZ FAIL
sphere_positions_5 HAS A SRS 18 ITZ WIN
BTW sphere_positions_5 HAS A SRS 18 ITZ FAIL
sphere_positions HAS A SRS 5 ITZ sphere_positions_5
I HAS A sphere_positions_6 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_6 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 6 ITZ sphere_positions_6
I HAS A sphere_positions_7 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_7 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 7 ITZ sphere_positions_7
I HAS A sphere_positions_8 ITZ A BUKKIT
IM IN YR LOOP UPPIN YR pos_index TIL BOTH SAEM pos_index AN 19
sphere_positions_8 HAS A SRS pos_index ITZ FAIL
IM OUTTA YR LOOP
sphere_positions HAS A SRS 8 ITZ sphere_positions_8
BTW Camera direction
I HAS A g ITZ Vector IZ constructin YR -6.0 AN YR -16.0 AN YR 0.0 MKAY
g R Vector IZ normalizin YR g MKAY
BTW Camera up vector
I HAS A a ITZ Vector IZ constructin YR 0.0 AN YR 0.0 AN YR 1.0 MKAY
a R Vector IZ cross_productin YR a AN YR g MKAY
a R Vector IZ normalizin YR a MKAY
a R Vector IZ scalin YR a AN YR 0.002 MKAY
BTW Camera right vector
I HAS A b ITZ Vector IZ cross_productin YR g AN YR a MKAY
b R Vector IZ normalizin YR b MKAY
b R Vector IZ scalin YR b AN YR 0.002 MKAY
BTW Camera eye offset
I HAS A c ITZ Vector IZ addin YR a AN YR b MKAY
c R Vector IZ scalin YR c AN YR -256.0 MKAY
c R Vector IZ addin YR c AN YR g MKAY
I HAS A max_x ITZ 511
I HAS A max_y ITZ max_x
BTW Issue the PPM Header info
VISIBLE "P3 " SUM OF max_x AN 1 " " SUM OF max_y AN 1 " 255"!
I HAS A viewpoint ITZ Vector IZ constructin YR 17 AN YR 16 AN YR 8 MKAY
I HAS A y ITZ max_y
IM IN YR y_loop
BOTH SAEM y AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A x ITZ max_x
IM IN YR x_loop
BOTH SAEM x AN -1, O RLY?
YA RLY, GTFO
OIC
I HAS A pixel_color ITZ Vector IZ constructin YR 13 AN YR 13 AN YR 13 MKAY
I HAS A rays ITZ 64
IM IN YR ray_loop
BOTH SAEM rays AN 0, O RLY?
YA RLY, GTFO
OIC
BTW The delta to apply to the origin of the view (For Depth of View blur).
I HAS A a_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
I HAS A t_a ITZ Vector IZ scalin YR a AN YR a_rand MKAY
t_a R Vector IZ scalin YR t_a AN YR 99.0 MKAY
I HAS A b_rand ITZ DIFF OF I IZ rand_onein MKAY AN 0.5
I HAS A t_b ITZ Vector IZ scalin YR b AN YR b_rand MKAY
t_b R Vector IZ scalin YR t_b AN YR 99.0 MKAY
I HAS A t ITZ Vector IZ addin YR t_a AN YR t_b MKAY
I HAS A origin ITZ Vector IZ addin YR viewpoint AN YR t MKAY
BTW Ray direction with random deltas for stochastic sampling
I HAS A direction_up ITZ SUM OF I IZ rand_onein MKAY AN x
direction_up R Vector IZ scalin YR a AN YR direction_up MKAY
I HAS A direction_right ITZ SUM OF I IZ rand_onein MKAY AN y
direction_right R Vector IZ scalin YR b AN YR direction_right MKAY
I HAS A direction_t ITZ Vector IZ scalin YR t AN YR -1 MKAY
I HAS A direction ITZ Vector IZ addin YR direction_right AN YR direction_up MKAY
direction R Vector IZ addin YR direction AN YR c MKAY
direction R Vector IZ scalin YR direction AN YR 16 MKAY
direction R Vector IZ addin YR direction AN YR direction_t MKAY
direction R Vector IZ normalizin YR direction MKAY
I HAS A sample_color ITZ I IZ samplin YR origin AN YR direction MKAY
sample_color R Vector IZ scalin YR sample_color AN YR 3.5 MKAY
BTW + pixel_color for color accumulation
pixel_color R Vector IZ addin YR sample_color AN YR pixel_color MKAY
rays R DIFF OF rays AN 1
IM OUTTA YR ray_loop
I HAS A write_color ITZ pixel_color
write_color'Z x IS NOW A NUMBR
write_color'Z y IS NOW A NUMBR
write_color'Z z IS NOW A NUMBR
DIFFRINT write_color'Z x AN BIGGR OF write_color'Z x AN 0, O RLY?
YA RLY, write_color'Z x R 0
OIC
DIFFRINT write_color'Z y AN BIGGR OF write_color'Z y AN 0, O RLY?
YA RLY, write_color'Z y R 0
OIC
DIFFRINT write_color'Z z AN BIGGR OF write_color'Z z AN 0, O RLY?
YA RLY, write_color'Z z R 0
OIC
VISIBLE " " write_color'Z x " " ...
" " write_color'Z y " " ...
" " write_color'Z z " "!
x R DIFF OF x AN 1
IM OUTTA YR x_loop
y R DIFF OF y AN 1
IM OUTTA YR y_loop
KTHXBYE

28
samples/Lua/wsapi.fcgi Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/lua
-- Generic WSAPI FastCGI launcher, extracts application to launch
-- from SCRIPT_FILENAME/PATH_TRANSLATED, each application (defined
-- by its script entry point) gets an isolated Lua VM; sequential
-- requests to the same application go to the same VM
pcall(require,"luarocks.require")
local common = require "wsapi.common"
local fastcgi = require "wsapi.fastcgi"
local ONE_HOUR = 60 * 60
local ONE_DAY = 24 * ONE_HOUR
local wsapi_loader = common.make_loader{
isolated = true, -- isolate each script in its own Lua state
filename = nil, -- if you want to force the launch of a single script
launcher = "wsapi.fcgi", -- the name of this script
reload = false, -- if you want to reload the application on every request
period = ONE_HOUR, -- frequency of Lua state staleness checks
ttl = ONE_DAY, -- time-to-live for Lua states
vars = -- order of checking for the path of the script
{ "SCRIPT_FILENAME",
"PATH_TRANSLATED" }
}
fastcgi.run(wsapi_loader)

View File

@@ -0,0 +1,207 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>renpengben</groupId>
<artifactId>spring4mvc-jpa</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>spring4mvc-jpa Maven Webapp</name>
<url>https://renpengben.github.io</url>
<description>spring4mvc-jpa</description>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.7</java.version>
<junit.version>4.11</junit.version>
<slf4j.version>1.7.7</slf4j.version>
<log4j.version>1.2.17</log4j.version>
<spring.version>4.0.5.RELEASE</spring.version>
<spring.data.jpa.version>1.6.0.RELEASE</spring.data.jpa.version>
<cglib.version>2.1_3</cglib.version>
<mysql.version>5.1.31</mysql.version>
<hibernate.version>4.3.5.Final</hibernate.version>
<hibernate-validator.version>5.1.1.Final</hibernate-validator.version>
<druid-version>1.0.6</druid-version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-jpa</artifactId>
<version>${spring.data.jpa.version}</version>
<exclusions>
<exclusion>
<artifactId>junit-dep</artifactId>
<groupId>junit</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>${cglib.version}</version>
</dependency>
<!-- JPA -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid-version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
</project>

3
samples/PHP/prefix.fcgi Executable file
View File

@@ -0,0 +1,3 @@
<?php
echo $_SERVER[$_GET["var"]];
?>

View File

@@ -0,0 +1,68 @@
Scriptname CAMTEST_OverShoulderME extends activemagiceffect
{Play with camera effects}
;--=== Imports ===--
Import Utility
Import Game
;--=== Properties ===--
Actor Property PlayerRef Auto
ActorBase Property CAMTEST_CameraActor Auto
;--=== Variables ===--
Actor Player
Actor Camera
Actor Target
Float PosX
Float PosY
Float PosZ
Float SpeedMult
ObjectReference Mist
ObjectReference Fog
;--=== Events ===--
Event OnInit()
Player = PlayerRef
EndEvent
Event onEffectStart(Actor akTarget, Actor akCaster)
Camera = Player.PlaceActorAtMe(CAMTEST_CameraActor)
Camera.EnableAI(False)
Camera.SetScale(0.1)
Camera.TranslateTo(Player.X + 40,Player.Y,Player.Z,0,0,0,800,30)
DisablePlayerControls(abMovement = true, abFighting = true, abCamSwitch = true, abLooking = true, abSneaking = true, abMenu = true, abActivate = true, abJournalTabs = false)
SetPlayerAIDriven(True)
ForceThirdPerson()
SetHUDCartMode()
SetInChargen(True, True, False)
SetCameraTarget(Camera)
ForceFirstPerson()
Wait(1)
Camera.SplineTranslateTo(Player.X + 4000,Player.Y,Player.Z + 1000,15,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)
; Camera.SetLookAt(Player)
Wait(10)
Camera.SplineTranslateTo(Player.X + 1000,Player.Y - 500,Player.Z + 500,25,0,Camera.GetHeadingAngle(Player) + Camera.GetAngleZ(),1800,800,100)
Wait(10)
SetHUDCartMode(False)
SetCameraTarget(Player)
SetInChargen(False, False, False)
EnablePlayerControls()
SetPlayerAIDriven(False)
EndEvent
Event onUpdate()
EndEvent
Event onEffectFinish(Actor akTarget, Actor akCaster)
EndEvent
;--=== Functions ===--

View File

@@ -0,0 +1 @@
Scriptname vMFX_FXPlugin extends Quest

View File

@@ -0,0 +1,120 @@
Scriptname vSCM_MetaQuestScript extends Quest
{Do initialization and track variables for scripts}
;--=== Imports ===--
Import Utility
Import Game
;--=== Properties ===--
Actor Property PlayerRef Auto
Float Property ModVersion Auto Hidden
String Property ModName = "Smarter Combat Music" Auto Hidden
Message Property vSCM_ModLoadedMSG Auto
Message Property vSCM_ModUpdatedMSG Auto
;--=== Variables ===--
Float _CurrentVersion
String _sCurrentVersion
Bool _Running
Float _ScriptLatency
Float _StartTime
Float _EndTime
;--=== Events ===--
Event OnInit()
If ModVersion == 0
DoUpkeep(True)
EndIf
EndEvent
Event OnReset()
Debug.Trace("SCM: Metaquest event: OnReset")
EndEvent
Event OnGameReloaded()
Debug.Trace("SCM: Metaquest event: OnGameReloaded")
EndEvent
;--=== Functions ===--
Function DoUpkeep(Bool DelayedStart = True)
;FIXME: CHANGE THIS WHEN UPDATING!
_CurrentVersion = 0.01
_sCurrentVersion = GetVersionString(_CurrentVersion)
String sErrorMessage
If DelayedStart
Wait(RandomFloat(2,4))
EndIf
Debug.Trace("SCM: " + ModName)
Debug.Trace("SCM: Performing upkeep...")
Debug.Trace("SCM: Loaded version is " + GetVersionString(ModVersion) + ", Current version is " + _sCurrentVersion)
If ModVersion == 0
Debug.Trace("SCM: Newly installed, doing initialization...")
DoInit()
If ModVersion == _CurrentVersion
Debug.Trace("SCM: Initialization succeeded.")
Else
Debug.Trace("SCM: WARNING! Initialization had a problem!")
EndIf
ElseIf ModVersion < _CurrentVersion
Debug.Trace("SCM: Installed version is older. Starting the upgrade...")
DoUpgrade()
If ModVersion != _CurrentVersion
Debug.Trace("SCM: WARNING! Upgrade failed!")
Debug.MessageBox("WARNING! " + ModName + " upgrade failed for some reason. You should report this to the mod author.")
EndIf
Debug.Trace("SCM: Upgraded to " + _CurrentVersion)
vSCM_ModUpdatedMSG.Show(_CurrentVersion)
Else
Debug.Trace("SCM: Loaded, no updates.")
;CheckForOrphans()
EndIf
CheckForExtras()
UpdateConfig()
Debug.Trace("SCM: Upkeep complete!")
EndFunction
Function DoInit()
Debug.Trace("SCM: Initializing...")
_Running = True
ModVersion = _CurrentVersion
vSCM_ModLoadedMSG.Show(_CurrentVersion)
EndFunction
Function DoUpgrade()
_Running = False
If ModVersion < 0.01
Debug.Trace("SCM: Upgrading to 0.01...")
ModVersion = 0.01
EndIf
_Running = True
Debug.Trace("SCM: Upgrade complete!")
EndFunction
Function UpdateConfig()
Debug.Trace("SCM: Updating configuration...")
Debug.Trace("SCM: Updated configuration values, some scripts may update in the background!")
EndFunction
String Function GetVersionString(Float fVersion)
Int Major = Math.Floor(fVersion) as Int
Int Minor = ((fVersion - (Major as Float)) * 100.0) as Int
If Minor < 10
Return Major + ".0" + Minor
Else
Return Major + "." + Minor
EndIf
EndFunction
Function CheckForExtras()
EndFunction

View File

@@ -0,0 +1,68 @@
/**
* Question 1.1
* combiner(+Buddies, -Pairs)
*/
combiner([], []).
combiner([First|Buddies], Pairs):-
make_pairs(First, Buddies, Pairs1),
combiner(Buddies, Pairs2),
concat(Pairs1, Pairs2, Pairs).
/**
* make_pairs(+Buddy, +Buddies, -Pairs)
*/
make_pairs(Buddy, [], []).
make_pairs(Buddy, [First|Buddies], [(Buddy, First)|Pairs]):-
make_pairs(Buddy, Buddies, Pairs).
/**
* concat(+X, +Y, ?T)
*/
concat([], Y, Y).
concat([P|R], Y, [P|T]):-
concat(R, Y, T).
/**
* Question 1.2
* extraire(+AllPossiblePairs, +NbPairs, -Tp, -RemainingPairs)
*/
extraire(AllPossiblePairs, 0, [], AllPossiblePairs).
extraire([PossiblePair|AllPossiblePairs], NbPairs, [PossiblePair|Tp], NewRemainingPairs):-
NbPairs > 0,
NewNbPairs is NbPairs - 1,
extraire(AllPossiblePairs, NewNbPairs, Tp, RemainingPairs),
not(pair_in_array(PossiblePair, Tp)),
delete_pair(RemainingPairs, PossiblePair, NewRemainingPairs).
extraire([PossiblePair|AllPossiblePairs], NbPairs, Tp, [PossiblePair|RemainingPairs]):-
NbPairs > 0,
extraire(AllPossiblePairs, NbPairs, Tp, RemainingPairs),
pair_in_array(PossiblePair, Tp).
/**
* delete_pair(+Pairs, +Pair, -PairsWithoutPair)
*/
delete_pair([], _, []).
delete_pair([Pair|Pairs], Pair, Pairs):-!.
delete_pair([FirstPair|Pairs], Pair, [FirstPair|PairsWithoutPair]):-
delete_pair(Pairs, Pair, PairsWithoutPair).
/**
* pair_in_array(+Pair, +Pairs)
*/
pair_in_array((A, B), [(C, D)|Pairs]):-
(A == C ; B == D ; A == D ; B == C),
!.
pair_in_array(Pair, [FirstPair|Pairs]):-
pair_in_array(Pair, Pairs).
/**
* Question 1.3
* les_tps(+Buddies, -Tps)
*/
les_tps(Buddies, Tps):-
combiner(Buddies, PossiblePairs),
length(Buddies, NbBuddies),
NbPairs is integer(NbBuddies / 2),
findall(Tp, extraire(PossiblePairs, NbPairs, Tp, _), Tps).

120
samples/Python/backstage.fcgi Executable file
View File

@@ -0,0 +1,120 @@
#!/usr/bin/env python
import sqlite
import urllib2
import csv
import cgi
import simplejson
import jsontemplate
import time
log = open('log.txt', 'a')
def urldecode(query):
d = {}
a = query.split('&')
for s in a:
if s.find('='):
k,v = map(urllib2.unquote, s.split('='))
try:
d[k].append(v)
except KeyError:
d[k] = [v]
return d
def load_table(uri, cur):
table = uri.split('/')[-1]
table = table.split('.')[0]
contents = urllib2.urlopen(uri)
fields = ""
for field in contents.readline().strip().split(','):
fields += field
fields += ","
fields = fields.rstrip(',')
cur.execute("SELECT name FROM sqlite_master WHERE type='table' \
AND name='%s';" % (table))
if cur.fetchone() == None:
# cur.execute("DROP TABLE %s;" % (table))
cur.execute("CREATE TABLE %s (%s);" % (table, fields))
for line in contents:
values = line.strip()
values = "','".join([val.strip() for val in values.split(",")])
values = "'" + values + "'"
sql = "INSERT INTO %s (%s) VALUES (%s);" % (table, fields, values)
cur.execute(sql)
return table
def build_structure(headings, allresults):
results = []
for result in allresults:
results.append(dict(zip(headings, result)))
results = { "query" : results }
return results
def build_json(headings, allresults, callback):
results = build_structure(headings, allresults)
return_str = simplejson.dumps(results)
if callback != None:
return_str = callback + "(" + return_str + ");";
return return_str
def load_template(templatefile):
return "".join(urllib2.urlopen(templatefile).readlines())
def build_template(headings, allresults, template_str):
results = build_structure(headings, allresults)
return jsontemplate.expand(template_str, results)
return ""
def myapp(environ, start_response):
args = cgi.parse_qs(environ['QUERY_STRING'])
query = args['query'][0]
uri = args['uri'][0]
callback = None
if 'callback' in args:
callback = args['callback'][0]
label = "no label"
if 'label' in args:
label = args['label'][0]
templatefile = None
if 'templatefile' in args:
templatefile = args['templatefile'][0]
con = sqlite.connect('mydatabase.db')
cur = con.cursor()
table_uris = uri.split(',')
tables = [load_table(uri, cur) for uri in table_uris]
con.commit()
before = time.time()
cur.execute(query)
allresults = cur.fetchall()
after = time.time()
log.write("%s: query time %f\n" % (label, after - before))
headings = [name[0] for name in cur.description]
return_str = ""
if templatefile != None:
start_response('200 OK', [('Content-Type', 'text/html')])
before = time.time()
template_str = load_template(templatefile)
after = time.time()
log.write("%s: template loading time %f\n" % (label, after - before))
before = time.time()
return_str = build_template(headings, allresults, template_str)
after = time.time()
log.write("%s: template rendering time %f\n" % (label, after - before))
else:
start_response('200 OK', [('Content-Type', 'text/plain')])
before = time.time()
return_str = build_json(headings, allresults, callback)
after = time.time()
log.write("%s: json-making time %f\n" % (label, after - before))
return return_str
if __name__ == '__main__':
from fcgi import WSGIServer
WSGIServer(myapp).run()

View File

@@ -0,0 +1,42 @@
PATH
remote: .
specs:
github-linguist (4.0.1)
charlock_holmes (~> 0.7.3)
escape_utils (~> 1.0.1)
mime-types (>= 1.19)
rugged (~> 0.22.0b1)
github-linguist-grammars (4.0.1)
GEM
remote: https://rubygems.org/
specs:
charlock_holmes (0.7.3)
coderay (1.1.0)
escape_utils (1.0.1)
metaclass (0.0.4)
method_source (0.8.2)
mime-types (2.4.3)
mocha (1.1.0)
metaclass (~> 0.0.1)
plist (3.1.0)
pry (0.10.1)
coderay (~> 1.1.0)
method_source (~> 0.8.1)
slop (~> 3.4)
rake (10.3.2)
rugged (0.22.0b1)
slop (3.6.0)
yajl-ruby (1.2.1)
PLATFORMS
ruby
DEPENDENCIES
github-linguist!
github-linguist-grammars!
mocha
plist (~> 3.1)
pry
rake
yajl-ruby

68
samples/Ruby/mdata_server.fcgi Executable file
View File

@@ -0,0 +1,68 @@
#!/usr/bin/env ruby
require "xmlrpc/server"
# NOTE: force the usage of the pure-ruby version of fcgi.
# - this is required by the workaround to get fcgi+xmlrpc working together
FCGI_PURE_RUBY=true
require 'fcgi'
require File.join(File.dirname(__FILE__), '../bt_cast/mdata_echo_server/bt_cast_mdata_server_t.rb')
################################################################################
################################################################################
# CGI handling for xmlrpc
################################################################################
################################################################################
# - for basic xmlrpc via CGI example
# - see http://www.ntecs.de/projects/xmlrpc4r/server.html#label-19
# create the directory needed for Neoip::Cast_mdata_server_t
Neoip::Cast_mdata_server_t.create_dir_ifneeded();
# init the cgi_server
cgi_server = XMLRPC::CGIServer.new
# register all the xmlrpc function
cgi_server.add_handler("set_cast_mdata_pull") do |web2srv_str, cast_name, cast_privtext, cast_id,
port_lview, port_pview, uri_pathquery|
Neoip::Cast_mdata_server_t.set_cast_mdata_pull(web2srv_str, cast_name, cast_privtext, cast_id,
port_lview, port_pview, uri_pathquery, ENV['REMOTE_ADDR']);
end
cgi_server.add_handler("set_cast_mdata_push") do |web2srv_str, cast_name, cast_privtext, cast_mdata|
Neoip::Cast_mdata_server_t.set_cast_mdata_push(web2srv_str, cast_name, cast_privtext, cast_mdata);
end
cgi_server.add_handler("get_cast_mdata") do |cast_name, cast_privhash|
Neoip::Cast_mdata_server_t.get_cast_mdata(cast_name, cast_privhash);
end
cgi_server.add_handler("del_cast_mdata") do |cast_name, cast_privtext|
Neoip::Cast_mdata_server_t.del_cast_mdata(cast_name, cast_privtext);
end
# handle the unknown/bad formered calls
cgi_server.set_default_handler do |name, *args|
raise XMLRPC::FaultException.new(-99, "Method #{name} missing" +
" or wrong number of parameters!")
end
# server the cgi_server
#cgi_server.serve
#exit
# experiment at using fast-cgi
FCGI.each_request do |request|
# XMLRPC::CGIServer expect some value in ENV[] but FCGI doesnt provides them
# - so working around by copying them by hand... dirty
ENV['REMOTE_ADDR'] = request.env['REMOTE_ADDR'];
ENV['REQUEST_METHOD'] = request.env['REQUEST_METHOD'];
ENV['CONTENT_TYPE'] = "text/xml";
ENV['CONTENT_LENGTH'] = "#{request.in.length}";
# copy the request in/out into the stdin/stdout to act as a CGI
$stdin = request.in
$stdout = request.out
# process the cgi itself
cgi_server.serve
# mark the request as finished
request.finish
end

View File

@@ -0,0 +1,30 @@
set -e
echo "/************/"
echo "/* BUILDING */"
echo "/************/"
echo ""
cd `dirname $0`
cd build
cmake ..
make
echo ""
echo "/***********/"
echo "/* TESTING */"
echo "/***********/"
echo ""
# ctest ..
make Experimental
echo ""
echo "/***********/"
echo "/* SUCCESS */"
echo "/***********/"
echo ""

Some files were not shown because too many files have changed in this diff Show More