mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	Compare commits
	
		
			437 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 9385e70d2d | ||
|  | 9469e188c8 | ||
|  | 6e57ca6fbc | ||
|  | d5e3ebaef3 | ||
|  | a9eac8a832 | ||
|  | 1c7f5368cf | ||
|  | 960ff73c7f | ||
|  | e1ce30c3ce | ||
|  | 89b442c751 | ||
|  | 6b41059cdf | ||
|  | 62cb42eee5 | ||
|  | 6bbb56db00 | ||
|  | 160598b9ef | ||
|  | 32b07a4e10 | ||
|  | 8890c57681 | ||
|  | de188126fb | ||
|  | 97a1adcef1 | ||
|  | ffbe95d6e5 | ||
|  | d54f86ae58 | ||
|  | 92ace440b9 | ||
|  | d5ee477d3b | ||
|  | 6e8152c423 | ||
|  | 8149356668 | ||
|  | 806e30d70f | ||
|  | 299ec8f8ea | ||
|  | f6fbd18bd5 | ||
|  | ecd30d3ccf | ||
|  | 228d89649a | ||
|  | 751360ecf1 | ||
|  | d9ed216092 | ||
|  | 18a3ef9e5e | ||
|  | e7b670c5de | ||
|  | 114fabd29a | ||
|  | 0946791434 | ||
|  | 06bcdba9c4 | ||
|  | 729a174eb6 | ||
|  | 1dbbcb73e7 | ||
|  | 87df17309c | ||
|  | f2cd75332c | ||
|  | 2cd7579e21 | ||
|  | d9daae176e | ||
|  | 20814ec533 | ||
|  | 9d8ab16a38 | ||
|  | 49c2793bf5 | ||
|  | b5cacbba9f | ||
|  | 20aee11cea | ||
|  | e8cf750e18 | ||
|  | 21f56744d4 | ||
|  | 02aeb4f895 | ||
|  | f9de16fbd2 | ||
|  | abe002f30c | ||
|  | e5ae6fb00d | ||
|  | a0a8dd8897 | ||
|  | e00f073726 | ||
|  | 1a9ee8e187 | ||
|  | 213fce00e0 | ||
|  | 380739b209 | ||
|  | 36322f8ac0 | ||
|  | 57d1ec7733 | ||
|  | 648c6d4547 | ||
|  | 6ab5870b59 | ||
|  | 7dbe2bb774 | ||
|  | 163a039e0d | ||
|  | 9595e2ba7e | ||
|  | a696e3a7a2 | ||
|  | ebabcfc84f | ||
|  | 8336dc33e4 | ||
|  | 5f22bf225c | ||
|  | 8eee8ad9cf | ||
|  | 24743985e4 | ||
|  | 94fba197d1 | ||
|  | 3504a36c3e | ||
|  | c8038d1c80 | ||
|  | 8ba8b48caf | ||
|  | 92d0c1f3b7 | ||
|  | d4186bd34a | ||
|  | 008ba9e23f | ||
|  | fd707ddf7e | ||
|  | f258e4940d | ||
|  | a7b8e38bf3 | ||
|  | b65129a8e1 | ||
|  | b6a9993c97 | ||
|  | 9c044c5bd0 | ||
|  | 6b0783936f | ||
|  | 2a66b754c2 | ||
|  | 460443b3c8 | ||
|  | cd99ab2d6e | ||
|  | b2cb74cabf | ||
|  | 6d07302963 | ||
|  | d831205f6a | ||
|  | a9b9e6216b | ||
|  | 3ba090de7e | ||
|  | c105208481 | ||
|  | 0c9e14eeff | ||
|  | 2a8a5cdca9 | ||
|  | 1f91acbd9d | ||
|  | 6f8278aa79 | ||
|  | 3e48a84cf1 | ||
|  | 31728a3a78 | ||
|  | e56a2ed6ad | ||
|  | 35aa57657b | ||
|  | 423c8865bd | ||
|  | 55ecc5f7eb | ||
|  | 6aae7882df | ||
|  | 240fcec3ce | ||
|  | 170c1d4ee8 | ||
|  | 38f0a71ea3 | ||
|  | 62936dc6b5 | ||
|  | fb9c784f4f | ||
|  | 89477ed2fa | ||
|  | 844679dcbe | ||
|  | cd743332f4 | ||
|  | 47843e7e78 | ||
|  | 85957ecf56 | ||
|  | 4232b04571 | ||
|  | 34f717526a | ||
|  | b0b94182a2 | ||
|  | 843e196f00 | ||
|  | 63661dfc6e | ||
|  | f100dc91c2 | ||
|  | fd9d63d605 | ||
|  | 5c21c35875 | ||
|  | 370d55fd74 | ||
|  | 0fcc26f778 | ||
|  | 8dd2ddcbf7 | ||
|  | 037857623d | ||
|  | d7b19d577b | ||
|  | c70048a3e2 | ||
|  | a1884ca261 | ||
|  | e452291314 | ||
|  | 6d51117a91 | ||
|  | 848a1cc1e5 | ||
|  | 9092dfdc7f | ||
|  | d7fe0cc5c7 | ||
|  | 15ec37d4bc | ||
|  | 43cc701ac3 | ||
|  | 7cb8357f73 | ||
|  | 4b46bcf649 | ||
|  | a954a6465e | ||
|  | afb6041104 | ||
|  | 4b28fdbc4d | ||
|  | b8a5e8505a | ||
|  | 3087d640a3 | ||
|  | e87b89ab5b | ||
|  | 7aabc6a5ad | ||
|  | 5cc053694a | ||
|  | 653314448c | ||
|  | 4f14db10ea | ||
|  | 98e348ba5f | ||
|  | a69b20c1a4 | ||
|  | 9275e5240f | ||
|  | 7dcc3b3edf | ||
|  | 6e872c11b6 | ||
|  | e5b6001759 | ||
|  | 769f1b8658 | ||
|  | 5814b61356 | ||
|  | 8a6d7f67ed | ||
|  | bcb016a938 | ||
|  | 065c6c02a8 | ||
|  | f7386fcd72 | ||
|  | df703ef997 | ||
|  | 9f6c421d91 | ||
|  | 91370ae955 | ||
|  | ffc0be191e | ||
|  | 6e9f6da2a2 | ||
|  | 48f2949d69 | ||
|  | baa3cba0fc | ||
|  | eb54a92328 | ||
|  | ce1e2441f4 | ||
|  | c8cb7b7cab | ||
|  | 7baa130d8d | ||
|  | 332d97b57f | ||
|  | 9c0dbdd48e | ||
|  | bec0052065 | ||
|  | 5010f32421 | ||
|  | ded4672ccc | ||
|  | 03bb48cf28 | ||
|  | e71eefe8fc | ||
|  | c203781e1b | ||
|  | 7a2be16d77 | ||
|  | 77126e9e17 | ||
|  | d1d5c61df5 | ||
|  | 09323c8bbc | ||
|  | ac9f82544a | ||
|  | 2e4e602787 | ||
|  | 9d0ba5801b | ||
|  | 0cd7d85ec4 | ||
|  | b0f674e511 | ||
|  | 2b411aad90 | ||
|  | 1c6483a499 | ||
|  | 6edf4498ce | ||
|  | b160a39678 | ||
|  | 86b4de89bd | ||
|  | a35d9a8d29 | ||
|  | 8012876d5e | ||
|  | 2e3e8c5b89 | ||
|  | 5284608942 | ||
|  | ea2c7d8b27 | ||
|  | b0db064d09 | ||
|  | 3ff1e38f6c | ||
|  | b533b682d5 | ||
|  | f59cf24a82 | ||
|  | f87436d499 | ||
|  | 178d4756ef | ||
|  | 5152bd7124 | ||
|  | b5015b6cc7 | ||
|  | 097900a327 | ||
|  | 1d2a6c38c7 | ||
|  | cc87ceb0d5 | ||
|  | a38f77683b | ||
|  | d8da05cde2 | ||
|  | 554b5bfe7f | ||
|  | 86aa4c3f3d | ||
|  | 19b8721225 | ||
|  | 0cb1ebc41e | ||
|  | c7c4883f49 | ||
|  | d8b4d4639c | ||
|  | ebe45e6f37 | ||
|  | cb016f8439 | ||
|  | 92212d2652 | ||
|  | 950882be78 | ||
|  | 036855072e | ||
|  | 29bbf50900 | ||
|  | ca59303dba | ||
|  | e21f35039b | ||
|  | f2b377fae8 | ||
|  | 24a36bf4bb | ||
|  | 3284450dc4 | ||
|  | ea9d326819 | ||
|  | 4cc679c1e5 | ||
|  | c49ce55714 | ||
|  | 9d4b5416a5 | ||
|  | 5a59ecbc2a | ||
|  | 82285df54b | ||
|  | e67c1789b8 | ||
|  | 015af19eaf | ||
|  | 156985ed52 | ||
|  | 71d1bd75c0 | ||
|  | 8e7c9c4bc4 | ||
|  | 7b7236fe30 | ||
|  | 55d997f43a | ||
|  | 1829b38339 | ||
|  | e4c28e12cf | ||
|  | 066cf45f4a | ||
|  | ac32b09a6b | ||
|  | 92296f4b4b | ||
|  | 3b4d2499eb | ||
|  | f38e15790e | ||
|  | b67c2bc2b2 | ||
|  | 393c9b759e | ||
|  | 54a7cf6785 | ||
|  | 1cf7a6389c | ||
|  | c204d7c297 | ||
|  | 5932f5f273 | ||
|  | 98977c87db | ||
|  | ff457af2d4 | ||
|  | 0e86ab9044 | ||
|  | 3d39e842ec | ||
|  | 16c1aa2845 | ||
|  | d0cf883558 | ||
|  | 64e4830aad | ||
|  | 0c47f2af75 | ||
|  | 14c5d8c95a | ||
|  | 6850499056 | ||
|  | 9288f784a1 | ||
|  | dab75f6f97 | ||
|  | 4a017d9033 | ||
|  | 6f896d988f | ||
|  | 35a9d241fc | ||
|  | 9ba0a7db64 | ||
|  | 9968503872 | ||
|  | 34218c5f58 | ||
|  | ebd41f1f20 | ||
|  | 62b1816297 | ||
|  | 2dfb864e4e | ||
|  | 2d1e1d4747 | ||
|  | f785aa0ae2 | ||
|  | cc476e212e | ||
|  | bca9716fc6 | ||
|  | fae6dbfebd | ||
|  | a7a0800b46 | ||
|  | 305293d3e5 | ||
|  | 17d4eb7a5e | ||
|  | f97e103b6d | ||
|  | dafca264b2 | ||
|  | be970e9e3d | ||
|  | e76837fa20 | ||
|  | e1b3403dc8 | ||
|  | 79da17c5c8 | ||
|  | e9623d542d | ||
|  | bc999f4067 | ||
|  | 474e536ae8 | ||
|  | 79647c5bb4 | ||
|  | 5409c39e35 | ||
|  | 5d4a24dd4f | ||
|  | c97abe7ef5 | ||
|  | edaea7bede | ||
|  | 909bce8ed9 | ||
|  | 4090c492e8 | ||
|  | a24afb0e12 | ||
|  | bc01f8b25f | ||
|  | 077c4141d6 | ||
|  | e5f20314e9 | ||
|  | 8a61bcb6b5 | ||
|  | 61b301b380 | ||
|  | be86f28be1 | ||
|  | a443380869 | ||
|  | 3d1d431cda | ||
|  | 9559ece8af | ||
|  | 8f56a1096d | ||
|  | 0ec85f902a | ||
|  | a47dde2166 | ||
|  | abdd6bfbd2 | ||
|  | d64104f472 | ||
|  | 1cd5ae2d57 | ||
|  | e27bf1627d | ||
|  | 0689d64efd | ||
|  | 3ba47aec38 | ||
|  | b90253981b | ||
|  | 513f678b6c | ||
|  | 478b9cf189 | ||
|  | 6675baff13 | ||
|  | a6efeebd21 | ||
|  | 6e2bb25b6e | ||
|  | a54edf71d1 | ||
|  | 8ff7eaf893 | ||
|  | a8d3872002 | ||
|  | dea03b7a46 | ||
|  | f5723dcccf | ||
|  | d772d1f162 | ||
|  | 46cfd16ae7 | ||
|  | 315243350b | ||
|  | 886d8a7293 | ||
|  | 54318f4001 | ||
|  | b3aee8abab | ||
|  | 1bdbadc1b3 | ||
|  | e0997b311b | ||
|  | 3c2ca312b9 | ||
|  | 315df1339a | ||
|  | e03b3e5ec4 | ||
|  | 43923976c2 | ||
|  | 6b8ee2f3f7 | ||
|  | 8cdb8ed48d | ||
|  | 417bf7e1c9 | ||
|  | b8e570bb3d | ||
|  | 69ff3c79b4 | ||
|  | eff4da20f8 | ||
|  | 473688b109 | ||
|  | 7bfb6ed5d7 | ||
|  | 276080aeec | ||
|  | 41c880afc7 | ||
|  | 3d242c3a3a | ||
|  | 9325b07d68 | ||
|  | ddeeb5d416 | ||
|  | c8bc0a5c79 | ||
|  | f58522d5a9 | ||
|  | 27a621531b | ||
|  | 0235433b7e | ||
|  | 6b5d1fe25b | ||
|  | fc73f51855 | ||
|  | f6e2189739 | ||
|  | d61f31d3ed | ||
|  | 4e83a6ad23 | ||
|  | 7fc39dc8d1 | ||
|  | f10154a782 | ||
|  | 8761dc4e17 | ||
|  | 5a044b1c07 | ||
|  | 0100b76412 | ||
|  | 149f8967ad | ||
|  | e376fe921b | ||
|  | 8d8020ddb5 | ||
|  | 7d13b9eb99 | ||
|  | 6ed0a05b44 | ||
|  | c4c479578a | ||
|  | 441caa91dd | ||
|  | 20154eb049 | ||
|  | 84ea710d42 | ||
|  | 8d524d618e | ||
|  | 9fa34ab1fe | ||
|  | 47db1cf1ac | ||
|  | f2f9b70659 | ||
|  | 61c93ab08c | ||
|  | d72f3fae33 | ||
|  | 3f14d15722 | ||
|  | 963c0b46a0 | ||
|  | 66b4977a67 | ||
|  | 126c2147e9 | ||
|  | f7c42a4e6a | ||
|  | b1ea1fd96f | ||
|  | a5475bf839 | ||
|  | be9e187cc6 | ||
|  | d5098c6f66 | ||
|  | 41fc785330 | ||
|  | 4d83bf34f3 | ||
|  | 3a797e2583 | ||
|  | 7802030a53 | ||
|  | e8e1e0ca23 | ||
|  | 973431be40 | ||
|  | 24fb5a8e29 | ||
|  | 37d161c290 | ||
|  | ddefa5f9e6 | ||
|  | 955dd3d4d5 | ||
|  | d125205564 | ||
|  | 7fa1b52497 | ||
|  | a90d21899a | ||
|  | 569058f481 | ||
|  | 4ecda08f1f | ||
|  | 3b23059c09 | ||
|  | a474ffc101 | ||
|  | f7672b837a | ||
|  | 5235871fd8 | ||
|  | cac9873e20 | ||
|  | 9094923de9 | ||
|  | 6454c96e6a | ||
|  | 7fbb9edc0f | ||
|  | 0a717f5c81 | ||
|  | dab9777621 | ||
|  | c8d1e9def1 | ||
|  | 272dd45a43 | ||
|  | 5abec96df7 | ||
|  | e860f961a9 | ||
|  | fea0d8963c | ||
|  | 7aca52c68c | ||
|  | 1828cf6fc7 | ||
|  | ad4d273241 | ||
|  | c4b876472f | ||
|  | e6fd58b3aa | ||
|  | 2ef905ef1e | ||
|  | db80aa84dc | ||
|  | f404cc16a1 | ||
|  | bb7d6ab429 | ||
|  | c5acce0604 | ||
|  | a6ccce7b76 | ||
|  | 2f4ea20fdd | ||
|  | 5580f39df2 | ||
|  | d94bffb198 | ||
|  | 2beb450df6 | 
							
								
								
									
										0
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| Gemfile.lock | ||||
| .bundle/ | ||||
| vendor/ | ||||
| benchmark/ | ||||
| lib/linguist/samples.json | ||||
|   | ||||
| @@ -1,11 +1,12 @@ | ||||
| before_install:  | ||||
| before_install: | ||||
|   - git fetch origin master:master | ||||
|   - git fetch origin v2.0.0:v2.0.0 | ||||
|   - git fetch origin test/attributes:test/attributes | ||||
|   - sudo apt-get install libicu-dev -y | ||||
|   - gem update --system 2.1.11 | ||||
| rvm: | ||||
|   - 1.9.3 | ||||
|   - 2.0.0 | ||||
|   - 2.1.1 | ||||
|   - 2.1 | ||||
|   - 2.2 | ||||
| notifications: | ||||
|   disabled: true | ||||
|   | ||||
							
								
								
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								Gemfile
									
									
									
									
									
								
							| @@ -1,2 +1,3 @@ | ||||
| source 'https://rubygems.org' | ||||
| gemspec | ||||
| gem 'test-unit', require: false if RUBY_VERSION >= '2.2' | ||||
|   | ||||
							
								
								
									
										89
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										89
									
								
								README.md
									
									
									
									
									
								
							| @@ -32,33 +32,57 @@ The Language stats bar that you see on every repository is built by aggregating | ||||
|  | ||||
| The repository stats API, accessed through `#languages`, can be used on a directory: | ||||
|  | ||||
| ***API UPDATE*** | ||||
|  | ||||
| Since [Version 3.0.0](https://github.com/github/linguist/releases/tag/v3.0.0) Linguist expects a git repository (in the form of a [Rugged::Repository](https://github.com/libgit2/rugged#repositories)) to be passed when initializing `Linguist::Repository`. | ||||
|  | ||||
|  | ||||
| ```ruby | ||||
| project = Linguist::Repository.from_directory(".") | ||||
| project.language.name  #=> "Ruby" | ||||
| project.languages      #=> { "Ruby" => 0.98, "Shell" => 0.02 } | ||||
| require 'rugged' | ||||
| require 'linguist' | ||||
|  | ||||
| repo = Rugged::Repository.new('.') | ||||
| project = Linguist::Repository.new(repo, repo.head.target_id) | ||||
| project.language       #=> "Ruby" | ||||
| project.languages      #=> { "Ruby" => 119387 } | ||||
| ``` | ||||
|  | ||||
| These stats are also printed out by the `linguist` binary. You can use the | ||||
| `--breakdown` flag, and the binary will also output the breakdown of files by language. | ||||
|  | ||||
| You can try running `linguist` on the `lib/` directory in this repository itself: | ||||
| You can try running `linguist` on the root directory in this repository itself: | ||||
|  | ||||
|     $ bundle exec linguist lib/ --breakdown | ||||
|     $ bundle exec linguist --breakdown | ||||
|  | ||||
|     100.00% Ruby | ||||
|  | ||||
|     Ruby: | ||||
|     linguist/blob_helper.rb | ||||
|     linguist/classifier.rb | ||||
|     linguist/file_blob.rb | ||||
|     linguist/generated.rb | ||||
|     linguist/heuristics.rb | ||||
|     linguist/language.rb | ||||
|     linguist/md5.rb | ||||
|     linguist/repository.rb | ||||
|     linguist/samples.rb | ||||
|     linguist/tokenizer.rb | ||||
|     linguist.rb | ||||
|     Gemfile | ||||
|     Rakefile | ||||
|     bin/linguist | ||||
|     github-linguist.gemspec | ||||
|     lib/linguist.rb | ||||
|     lib/linguist/blob_helper.rb | ||||
|     lib/linguist/classifier.rb | ||||
|     lib/linguist/file_blob.rb | ||||
|     lib/linguist/generated.rb | ||||
|     lib/linguist/heuristics.rb | ||||
|     lib/linguist/language.rb | ||||
|     lib/linguist/lazy_blob.rb | ||||
|     lib/linguist/md5.rb | ||||
|     lib/linguist/repository.rb | ||||
|     lib/linguist/samples.rb | ||||
|     lib/linguist/tokenizer.rb | ||||
|     lib/linguist/version.rb | ||||
|     test/test_blob.rb | ||||
|     test/test_classifier.rb | ||||
|     test/test_heuristics.rb | ||||
|     test/test_language.rb | ||||
|     test/test_md5.rb | ||||
|     test/test_pedantic.rb | ||||
|     test/test_repository.rb | ||||
|     test/test_samples.rb | ||||
|     test/test_tokenizer.rb | ||||
|  | ||||
| #### Ignore vendored files | ||||
|  | ||||
| @@ -80,9 +104,34 @@ Linguist::FileBlob.new("underscore.min.js").generated? # => true | ||||
|  | ||||
| See [Linguist::Generated#generated?](https://github.com/github/linguist/blob/master/lib/linguist/generated.rb). | ||||
|  | ||||
| ## Overrides | ||||
|  | ||||
| Linguist supports custom overrides for language definitions and vendored paths. Add a `.gitattributes` file to your project using the keys `linguist-language` and `linguist-vendored` with the standard git-style path matchers for the files you want to override. | ||||
|  | ||||
| Please note that the overrides currently only affect the language statistics for a repository and not the syntax-highlighting of files. | ||||
|  | ||||
| ``` | ||||
| $ cat .gitattributes | ||||
| *.rb linguist-language=Java | ||||
|  | ||||
| $ linguist --breakdown | ||||
| 100.00% Java | ||||
|  | ||||
| Java: | ||||
| ruby_file.rb | ||||
| ``` | ||||
|  | ||||
| By default, Linguist treats all of the paths defined in [lib/linguist/vendor.yml](https://github.com/github/linguist/blob/master/lib/linguist/vendor.yml) as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths. | ||||
|  | ||||
| ``` | ||||
| $ cat .gitattributes | ||||
| special-vendored-path/* linguist-vendored | ||||
| jquery.js linguist-vendored=false | ||||
| ``` | ||||
|  | ||||
| ## Installation | ||||
|  | ||||
| github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist). | ||||
| Github.com is usually running the latest version of the `github-linguist` gem that is released on [RubyGems.org](http://rubygems.org/gems/github-linguist). | ||||
|  | ||||
| But for development you are going to want to checkout out the source. To get it, clone the repo and run [Bundler](http://gembundler.com/) to install its dependencies. | ||||
|  | ||||
| @@ -102,10 +151,6 @@ We try to only add languages once they have some usage on GitHub, so please note | ||||
|  | ||||
| Almost all bug fixes or new language additions should come with some additional code samples. Just drop them under [`samples/`](https://github.com/github/linguist/tree/master/samples) in the correct subdirectory and our test suite will automatically test them. In most cases you shouldn't need to add any new assertions. | ||||
|  | ||||
| To update the `samples.json` after adding new files to [`samples/`](https://github.com/github/linguist/tree/master/samples): | ||||
|  | ||||
|     bundle exec rake samples | ||||
|  | ||||
| ### A note on language extensions | ||||
|  | ||||
| Linguist has a number of methods available to it for identifying the language of a particular file. The initial lookup is based upon the extension of the file, possible file extensions are defined in an array called `extensions`. Take a look at this example for example for `Perl`: | ||||
| @@ -145,7 +190,7 @@ If you are the current maintainer of this gem: | ||||
|  0. Ensure that tests are green: `bundle exec rake test` | ||||
|  0. Bump gem version in `lib/linguist/version.rb`.  For example, [like this](https://github.com/github/linguist/commit/8d2ea90a5ba3b2fe6e1508b7155aa4632eea2985). | ||||
|  0. Make a PR to github/linguist.  For example, [#1238](https://github.com/github/linguist/pull/1238). | ||||
|  0. Build a local gem: `gem build github-linguist.gemspec` | ||||
|  0. Build a local gem: `bundle exec rake build_gem` | ||||
|  0. Testing: | ||||
|    0. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem | ||||
|    0. Install the new gem locally | ||||
|   | ||||
							
								
								
									
										101
									
								
								Rakefile
									
									
									
									
									
								
							
							
						
						
									
										101
									
								
								Rakefile
									
									
									
									
									
								
							| @@ -1,27 +1,97 @@ | ||||
| require 'json' | ||||
| require 'bundler/setup' | ||||
| require 'rake/clean' | ||||
| require 'rake/testtask' | ||||
| require 'yaml' | ||||
| require 'yajl' | ||||
|  | ||||
| task :default => :test | ||||
|  | ||||
| Rake::TestTask.new | ||||
|  | ||||
| task :samples do | ||||
|   require 'linguist/samples' | ||||
|   require 'yajl' | ||||
|   data = Linguist::Samples.data | ||||
|   json = Yajl::Encoder.encode(data, :pretty => true) | ||||
|   File.open('lib/linguist/samples.json', 'w') { |io| io.write json } | ||||
| # Extend test task to check for samples | ||||
| task :test => :check_samples | ||||
|  | ||||
| desc "Check that we have samples.json generated" | ||||
| task :check_samples do | ||||
|   unless File.exist?('lib/linguist/samples.json') | ||||
|     Rake::Task[:samples].invoke | ||||
|   end | ||||
| end | ||||
|  | ||||
| task :build_gem do | ||||
| task :samples do | ||||
|   require 'linguist/samples' | ||||
|   json = Yajl.dump(Linguist::Samples.data, :pretty => true) | ||||
|   File.write 'lib/linguist/samples.json', json | ||||
| end | ||||
|  | ||||
| task :build_gem => :samples do | ||||
|   languages = YAML.load_file("lib/linguist/languages.yml") | ||||
|   File.write("lib/linguist/languages.json", JSON.dump(languages)) | ||||
|   File.write("lib/linguist/languages.json", Yajl.dump(languages)) | ||||
|   `gem build github-linguist.gemspec` | ||||
|   File.delete("lib/linguist/languages.json") | ||||
| end | ||||
|  | ||||
| namespace :benchmark do | ||||
|   benchmark_path = "benchmark/results" | ||||
|  | ||||
|   # $ bundle exec rake benchmark:generate CORPUS=path/to/samples | ||||
|   desc "Generate results for" | ||||
|   task :generate do | ||||
|     ref = `git rev-parse HEAD`.strip[0,8] | ||||
|  | ||||
|     corpus = File.expand_path(ENV["CORPUS"] || "samples") | ||||
|  | ||||
|     require 'linguist/language' | ||||
|  | ||||
|     results = Hash.new | ||||
|     Dir.glob("#{corpus}/**/*").each do |file| | ||||
|       next unless File.file?(file) | ||||
|       filename = file.gsub("#{corpus}/", "") | ||||
|       results[filename] = Linguist::FileBlob.new(file).language | ||||
|     end | ||||
|  | ||||
|     # Ensure results directory exists | ||||
|     FileUtils.mkdir_p("benchmark/results") | ||||
|  | ||||
|     # Write results | ||||
|     if `git status`.include?('working directory clean') | ||||
|       result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}.json" | ||||
|     else | ||||
|       result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json" | ||||
|     end | ||||
|  | ||||
|     File.write(result_filename, results.to_json) | ||||
|     puts "wrote #{result_filename}" | ||||
|   end | ||||
|  | ||||
|   # $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json | ||||
|   desc "Compare results" | ||||
|   task :compare do | ||||
|     reference_file = ENV["REFERENCE"] | ||||
|     candidate_file = ENV["CANDIDATE"] | ||||
|  | ||||
|     reference = Yajl.load(File.read(reference_file)) | ||||
|     reference_counts = Hash.new(0) | ||||
|     reference.each { |filename, language| reference_counts[language] += 1 } | ||||
|  | ||||
|     candidate = Yajl.load(File.read(candidate_file)) | ||||
|     candidate_counts = Hash.new(0) | ||||
|     candidate.each { |filename, language| candidate_counts[language] += 1 } | ||||
|  | ||||
|     changes = diff(reference_counts, candidate_counts) | ||||
|  | ||||
|     if changes.any? | ||||
|       changes.each do |language, (before, after)| | ||||
|         before_percent = 100 * before / reference.size.to_f | ||||
|         after_percent = 100 * after / candidate.size.to_f | ||||
|         puts "%s changed from %.1f%% to %.1f%%" % [language || 'unknown', before_percent, after_percent] | ||||
|       end | ||||
|     else | ||||
|       puts "No changes" | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
| namespace :classifier do | ||||
|   LIMIT = 1_000 | ||||
|  | ||||
| @@ -37,7 +107,7 @@ namespace :classifier do | ||||
|       next if file_language.nil? || file_language == 'Text' | ||||
|       begin | ||||
|         data = open(file_url).read | ||||
|         guessed_language, score = Linguist::Classifier.classify(Linguist::Samples::DATA, data).first | ||||
|         guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first | ||||
|  | ||||
|         total += 1 | ||||
|         guessed_language == file_language ? correct += 1 : incorrect += 1 | ||||
| @@ -54,14 +124,12 @@ namespace :classifier do | ||||
|  | ||||
|   def each_public_gist | ||||
|     require 'open-uri' | ||||
|     require 'json' | ||||
|  | ||||
|     url = "https://api.github.com/gists/public" | ||||
|  | ||||
|     loop do | ||||
|       resp = open(url) | ||||
|       url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1] | ||||
|       gists = JSON.parse(resp.read) | ||||
|       gists = Yajl.load(resp.read) | ||||
|  | ||||
|       for gist in gists | ||||
|         for filename, attrs in gist['files'] | ||||
| @@ -71,3 +139,10 @@ namespace :classifier do | ||||
|     end | ||||
|   end | ||||
| end | ||||
|  | ||||
|  | ||||
| def diff(a, b) | ||||
|   (a.keys | b.keys).each_with_object({}) do |key, diff| | ||||
|     diff[key] = [a[key], b[key]] unless a[key] == b[key] | ||||
|   end | ||||
| end | ||||
|   | ||||
| @@ -17,10 +17,10 @@ Gem::Specification.new do |s| | ||||
|   s.add_dependency 'escape_utils',    '~> 1.0.1' | ||||
|   s.add_dependency 'mime-types',      '~> 1.19' | ||||
|   s.add_dependency 'pygments.rb',     '~> 0.6.0' | ||||
|   s.add_dependency 'rugged',          '~> 0.21.0' | ||||
|   s.add_dependency 'rugged',          '~> 0.21.1b2' | ||||
|  | ||||
|   s.add_development_dependency 'json' | ||||
|   s.add_development_dependency 'mocha' | ||||
|   s.add_development_dependency 'pry' | ||||
|   s.add_development_dependency 'rake' | ||||
|   s.add_development_dependency 'yajl-ruby' | ||||
| end | ||||
|   | ||||
| @@ -321,6 +321,11 @@ module Linguist | ||||
|       language ? language.lexer : Pygments::Lexer.find_by_name('Text only') | ||||
|     end | ||||
|  | ||||
|     # Internal: Get the TextMate compatible scope for the blob | ||||
|     def tm_scope | ||||
|       language && language.tm_scope | ||||
|     end | ||||
|  | ||||
|     # Public: Highlight syntax of blob | ||||
|     # | ||||
|     # options - A Hash of options (defaults to {}) | ||||
|   | ||||
| @@ -63,6 +63,7 @@ module Linguist | ||||
|         generated_jni_header? || | ||||
|         composer_lock? || | ||||
|         node_modules? || | ||||
|         godeps? || | ||||
|         vcr_cassette? || | ||||
|         generated_by_zephir? | ||||
|     end | ||||
| @@ -231,11 +232,19 @@ module Linguist | ||||
|       !!name.match(/node_modules\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob part of Godeps/, | ||||
|     # which are not meant for humans in pull requests. | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def godeps? | ||||
|       !!name.match(/Godeps\//) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated php composer lock file? | ||||
|     # | ||||
|     # Returns true or false. | ||||
|     def composer_lock? | ||||
|       !!name.match(/composer.lock/) | ||||
|       !!name.match(/composer\.lock/) | ||||
|     end | ||||
|  | ||||
|     # Internal: Is the blob a generated by Zephir | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| module Linguist | ||||
|   # A collection of simple heuristics that can be used to better analyze languages. | ||||
|   class Heuristics | ||||
|     ACTIVE = false | ||||
|     ACTIVE = true | ||||
|  | ||||
|     # Public: Given an array of String language names, | ||||
|     # apply heuristics against the given data and return an array | ||||
| @@ -13,28 +13,32 @@ module Linguist | ||||
|     # Returns an array of Languages or [] | ||||
|     def self.find_by_heuristics(data, languages) | ||||
|       if active? | ||||
|         if languages.all? { |l| ["Objective-C", "C++"].include?(l) } | ||||
|           disambiguate_c(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Perl", "Prolog"].include?(l) } | ||||
|           disambiguate_pl(data, languages) | ||||
|           result = disambiguate_pl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["ECL", "Prolog"].include?(l) } | ||||
|           disambiguate_ecl(data, languages) | ||||
|           result = disambiguate_ecl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["TypeScript", "XML"].include?(l) } | ||||
|           disambiguate_ts(data, languages) | ||||
|         if languages.all? { |l| ["IDL", "Prolog"].include?(l) } | ||||
|           result = disambiguate_pro(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Common Lisp", "OpenCL"].include?(l) } | ||||
|           disambiguate_cl(data, languages) | ||||
|           result = disambiguate_cl(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Rebol", "R"].include?(l) } | ||||
|           disambiguate_r(data, languages) | ||||
|         if languages.all? { |l| ["Hack", "PHP"].include?(l) } | ||||
|           result = disambiguate_hack(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["Scala", "SuperCollider"].include?(l) } | ||||
|           result = disambiguate_sc(data, languages) | ||||
|         end | ||||
|         if languages.all? { |l| ["AsciiDoc", "AGS Script"].include?(l) } | ||||
|           result = disambiguate_asc(data, languages) | ||||
|         end | ||||
|         return result | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # .h extensions are ambigious between C, C++, and Objective-C. | ||||
|     # .h extensions are ambiguous between C, C++, and Objective-C. | ||||
|     # We want to shortcut look for Objective-C _and_ now C++ too! | ||||
|     # | ||||
|     # Returns an array of Languages or [] | ||||
| @@ -59,6 +63,16 @@ module Linguist | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_pro(data, languages) | ||||
|       matches = [] | ||||
|       if (data.include?(":-")) | ||||
|         matches << Language["Prolog"] | ||||
|       else | ||||
|         matches << Language["IDL"] | ||||
|       end | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_ts(data, languages) | ||||
|       matches = [] | ||||
|       if (data.include?("</translation>")) | ||||
| @@ -83,6 +97,33 @@ module Linguist | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_hack(data, languages) | ||||
|       matches = [] | ||||
|       if data.include?("<?hh") | ||||
|         matches << Language["Hack"] | ||||
|       elsif /<?[^h]/.match(data) | ||||
|         matches << Language["PHP"] | ||||
|       end | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_sc(data, languages) | ||||
|       matches = [] | ||||
|       if (/\^(this|super)\./.match(data) || /^\s*(\+|\*)\s*\w+\s*{/.match(data) || /^\s*~\w+\s*=\./.match(data)) | ||||
|         matches << Language["SuperCollider"] | ||||
|       end | ||||
|       if (/^\s*import (scala|java)\./.match(data) || /^\s*val\s+\w+\s*=/.match(data) || /^\s*class\b/.match(data)) | ||||
|         matches << Language["Scala"] | ||||
|       end | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.disambiguate_asc(data, languages) | ||||
|       matches = [] | ||||
|       matches << Language["AsciiDoc"] if /^=+(\s|\n)/.match(data) | ||||
|       matches | ||||
|     end | ||||
|  | ||||
|     def self.active? | ||||
|       !!ACTIVE | ||||
|     end | ||||
|   | ||||
| @@ -2,7 +2,7 @@ require 'escape_utils' | ||||
| require 'pygments' | ||||
| require 'yaml' | ||||
| begin | ||||
|   require 'json' | ||||
|   require 'yajl' | ||||
| rescue LoadError | ||||
| end | ||||
|  | ||||
| @@ -62,7 +62,7 @@ module Linguist | ||||
|       end | ||||
|  | ||||
|       # Language name index | ||||
|       @index[language.name] = @name_index[language.name] = language | ||||
|       @index[language.name.downcase] = @name_index[language.name.downcase] = language | ||||
|  | ||||
|       language.aliases.each do |name| | ||||
|         # All Language aliases should be unique. Raise if there is a duplicate. | ||||
| @@ -70,7 +70,7 @@ module Linguist | ||||
|           raise ArgumentError, "Duplicate alias: #{name}" | ||||
|         end | ||||
|  | ||||
|         @index[name] = @alias_index[name] = language | ||||
|         @index[name.downcase] = @alias_index[name.downcase] = language | ||||
|       end | ||||
|  | ||||
|       language.extensions.each do |extension| | ||||
| @@ -135,8 +135,8 @@ module Linguist | ||||
|         # No shebang. Still more work to do. Try to find it with our heuristics. | ||||
|         elsif (determined = Heuristics.find_by_heuristics(data, possible_language_names)) && !determined.empty? | ||||
|           determined.first | ||||
|         # Lastly, fall back to the probablistic classifier. | ||||
|         elsif classified = Classifier.classify(Samples::DATA, data, possible_language_names ).first | ||||
|         # Lastly, fall back to the probabilistic classifier. | ||||
|         elsif classified = Classifier.classify(Samples.cache, data, possible_language_names).first | ||||
|           # Return the actual Language object based of the string language name (i.e., first element of `#classify`) | ||||
|           Language[classified[0]] | ||||
|         end | ||||
| @@ -164,7 +164,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.find_by_name(name) | ||||
|       @name_index[name] | ||||
|       name && @name_index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Language by one of its aliases. | ||||
| @@ -178,7 +178,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Lexer or nil if none was found. | ||||
|     def self.find_by_alias(name) | ||||
|       @alias_index[name] | ||||
|       name && @alias_index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by filename. | ||||
| @@ -194,9 +194,25 @@ module Linguist | ||||
|     def self.find_by_filename(filename) | ||||
|       basename = File.basename(filename) | ||||
|       extname = FileBlob.new(filename).extension | ||||
|       langs = @filename_index[basename] + | ||||
|               @extension_index[extname] | ||||
|       langs.compact.uniq | ||||
|       (@filename_index[basename] + find_by_extension(extname)).compact.uniq | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by file extension. | ||||
|     # | ||||
|     # extname - The extension String. | ||||
|     # | ||||
|     # Examples | ||||
|     # | ||||
|     #   Language.find_by_extension('.rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     # | ||||
|     #   Language.find_by_extension('rb') | ||||
|     #   # => [#<Language name="Ruby">] | ||||
|     # | ||||
|     # Returns all matching Languages or [] if none were found. | ||||
|     def self.find_by_extension(extname) | ||||
|       extname = ".#{extname}" unless extname.start_with?(".") | ||||
|       @extension_index[extname] | ||||
|     end | ||||
|  | ||||
|     # Public: Look up Languages by shebang line. | ||||
| @@ -227,7 +243,7 @@ module Linguist | ||||
|     # | ||||
|     # Returns the Language or nil if none was found. | ||||
|     def self.[](name) | ||||
|       @index[name] | ||||
|       name && @index[name.downcase] | ||||
|     end | ||||
|  | ||||
|     # Public: A List of popular languages | ||||
| @@ -290,6 +306,16 @@ module Linguist | ||||
|       @lexer = Pygments::Lexer.find_by_name(attributes[:lexer] || name) || | ||||
|         raise(ArgumentError, "#{@name} is missing lexer") | ||||
|  | ||||
|       @tm_scope = attributes[:tm_scope] || begin | ||||
|         context = case @type | ||||
|                   when :data, :markup, :prose | ||||
|                     'text' | ||||
|                   when :programming, nil | ||||
|                     'source' | ||||
|                   end | ||||
|         "#{context}.#{@name.downcase}" | ||||
|       end | ||||
|  | ||||
|       @ace_mode = attributes[:ace_mode] | ||||
|       @wrap = attributes[:wrap] || false | ||||
|  | ||||
| @@ -363,6 +389,11 @@ module Linguist | ||||
|     # Returns the Lexer | ||||
|     attr_reader :lexer | ||||
|  | ||||
|     # Public: Get the name of a TextMate-compatible scope | ||||
|     # | ||||
|     # Returns the scope | ||||
|     attr_reader :tm_scope | ||||
|  | ||||
|     # Public: Get Ace mode | ||||
|     # | ||||
|     # Examples | ||||
| @@ -510,16 +541,16 @@ module Linguist | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   extensions = Samples::DATA['extnames'] | ||||
|   interpreters = Samples::DATA['interpreters'] | ||||
|   filenames = Samples::DATA['filenames'] | ||||
|   extensions = Samples.cache['extnames'] | ||||
|   interpreters = Samples.cache['interpreters'] | ||||
|   filenames = Samples.cache['filenames'] | ||||
|   popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) | ||||
|  | ||||
|   languages_yml = File.expand_path("../languages.yml", __FILE__) | ||||
|   languages_json = File.expand_path("../languages.json", __FILE__) | ||||
|  | ||||
|   if File.exist?(languages_json) && defined?(JSON) | ||||
|     languages = JSON.load(File.read(languages_json)) | ||||
|   if File.exist?(languages_json) && defined?(Yajl) | ||||
|     languages = Yajl.load(File.read(languages_json)) | ||||
|   else | ||||
|     languages = YAML.load_file(languages_yml) | ||||
|   end | ||||
| @@ -532,6 +563,7 @@ module Linguist | ||||
|     if extnames = extensions[name] | ||||
|       extnames.each do |extname| | ||||
|         if !options['extensions'].include?(extname) | ||||
|           warn "#{name} has a sample with extension (#{extname}) that isn't explicitly defined in languages.yml" unless extname == '.script!' | ||||
|           options['extensions'] << extname | ||||
|         end | ||||
|       end | ||||
| @@ -563,6 +595,7 @@ module Linguist | ||||
|       :type              => options['type'], | ||||
|       :aliases           => options['aliases'], | ||||
|       :lexer             => options['lexer'], | ||||
|       :tm_scope          => options['tm_scope'], | ||||
|       :ace_mode          => options['ace_mode'], | ||||
|       :wrap              => options['wrap'], | ||||
|       :group_name        => options['group'], | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,8 +1,13 @@ | ||||
| require 'linguist/blob_helper' | ||||
| require 'linguist/language' | ||||
| require 'rugged' | ||||
|  | ||||
| module Linguist | ||||
|   class LazyBlob | ||||
|     GIT_ATTR = ['linguist-language', 'linguist-vendored'] | ||||
|     GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true } | ||||
|     GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS) | ||||
|  | ||||
|     include BlobHelper | ||||
|  | ||||
|     MAX_SIZE = 128 * 1024 | ||||
| @@ -19,6 +24,29 @@ module Linguist | ||||
|       @mode = mode | ||||
|     end | ||||
|  | ||||
|     def git_attributes | ||||
|       @git_attributes ||= repository.fetch_attributes( | ||||
|         name, GIT_ATTR, GIT_ATTR_FLAGS) | ||||
|     end | ||||
|  | ||||
|     def vendored? | ||||
|       if attr = git_attributes['linguist-vendored'] | ||||
|         return boolean_attribute(attr) | ||||
|       else | ||||
|         return super | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def language | ||||
|       return @language if defined?(@language) | ||||
|  | ||||
|       @language = if lang = git_attributes['linguist-language'] | ||||
|         Language.find_by_name(lang) | ||||
|       else | ||||
|         super | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     def data | ||||
|       load_blob! | ||||
|       @data | ||||
| @@ -30,6 +58,12 @@ module Linguist | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|  | ||||
|     # Returns true if the attribute is present and not the string "false". | ||||
|     def boolean_attribute(attr) | ||||
|       attr != "false" | ||||
|     end | ||||
|  | ||||
|     def load_blob! | ||||
|       @data, @size = Rugged::Blob.to_buffer(repository, oid, MAX_SIZE) if @data.nil? | ||||
|     end | ||||
|   | ||||
| @@ -110,18 +110,37 @@ module Linguist | ||||
|         if @old_commit_oid == @commit_oid | ||||
|           @old_stats | ||||
|         else | ||||
|           compute_stats(@old_commit_oid, @commit_oid, @old_stats) | ||||
|           compute_stats(@old_commit_oid, @old_stats) | ||||
|         end | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|     def compute_stats(old_commit_oid, commit_oid, cache = nil) | ||||
|       file_map = cache ? cache.dup : {} | ||||
|       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||
|       new_tree = Rugged::Commit.lookup(repository, commit_oid).tree | ||||
|     def read_index | ||||
|       attr_index = Rugged::Index.new | ||||
|       attr_index.read_tree(current_tree) | ||||
|       repository.index = attr_index | ||||
|     end | ||||
|  | ||||
|       diff = Rugged::Tree.diff(repository, old_tree, new_tree) | ||||
|     def current_tree | ||||
|       @tree ||= Rugged::Commit.lookup(repository, @commit_oid).tree | ||||
|     end | ||||
|  | ||||
|     protected | ||||
|  | ||||
|     def compute_stats(old_commit_oid, cache = nil) | ||||
|       old_tree = old_commit_oid && Rugged::Commit.lookup(repository, old_commit_oid).tree | ||||
|  | ||||
|       read_index | ||||
|  | ||||
|       diff = Rugged::Tree.diff(repository, old_tree, current_tree) | ||||
|  | ||||
|       # Clear file map and fetch full diff if any .gitattributes files are changed | ||||
|       if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" } | ||||
|         diff = Rugged::Tree.diff(repository, old_tree = nil, current_tree) | ||||
|         file_map = {} | ||||
|       else | ||||
|         file_map = cache ? cache.dup : {} | ||||
|       end | ||||
|  | ||||
|       diff.each_delta do |delta| | ||||
|         old = delta.old_file[:path] | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,5 +1,5 @@ | ||||
| begin | ||||
|   require 'json' | ||||
|   require 'yajl' | ||||
| rescue LoadError | ||||
|   require 'yaml' | ||||
| end | ||||
| @@ -17,9 +17,11 @@ module Linguist | ||||
|     PATH = File.expand_path('../samples.json', __FILE__) | ||||
|  | ||||
|     # Hash of serialized samples object | ||||
|     if File.exist?(PATH) | ||||
|       serializer = defined?(JSON) ? JSON : YAML | ||||
|       DATA = serializer.load(File.read(PATH)) | ||||
|     def self.cache | ||||
|       @cache ||= begin | ||||
|         serializer = defined?(Yajl) ? Yajl : YAML | ||||
|         serializer.load(File.read(PATH)) | ||||
|       end | ||||
|     end | ||||
|  | ||||
|     # Public: Iterate over each sample. | ||||
|   | ||||
| @@ -33,18 +33,34 @@ | ||||
| # Erlang bundles | ||||
| - ^rebar$ | ||||
|  | ||||
| # Bootstrap minified css and js | ||||
| - (^|/)bootstrap([^.]*)(\.min)?\.(js|css)$ | ||||
| # Go dependencies | ||||
| - Godeps/_workspace/ | ||||
|  | ||||
| # Minified JavaScript and CSS | ||||
| - (\.|-)min\.(js|css)$ | ||||
|  | ||||
| # Bootstrap css and js | ||||
| - (^|/)bootstrap([^.]*)\.(js|css)$ | ||||
|  | ||||
| # Font Awesome | ||||
| - font-awesome.css | ||||
|  | ||||
| # Foundation css | ||||
| - foundation.min.css | ||||
| - foundation.css | ||||
|  | ||||
| # Normalize.css | ||||
| - normalize.css | ||||
|  | ||||
| # Bourbon SCSS | ||||
| - (^|/)[Bb]ourbon/.*\.css$ | ||||
| - (^|/)[Bb]ourbon/.*\.scss$ | ||||
|  | ||||
| # Animate.css | ||||
| - animate.css | ||||
|  | ||||
| # Vendored dependencies | ||||
| - thirdparty/ | ||||
| - third[-_]?party/ | ||||
| - 3rd[-_]?party/ | ||||
| - vendors?/ | ||||
| - extern(al)?/ | ||||
|  | ||||
| @@ -57,12 +73,12 @@ | ||||
| ## Commonly Bundled JavaScript frameworks ## | ||||
|  | ||||
| # jQuery | ||||
| - (^|/)jquery([^.]*)(\.min)?\.js$ | ||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.js$ | ||||
| - (^|/)jquery\-\d\.\d+(\.\d+)?\.js$ | ||||
|  | ||||
| # jQuery UI | ||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?(\.min)?\.(js|css)$ | ||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)(\.min)?\.(js|css)$ | ||||
| - (^|/)jquery\-ui(\-\d\.\d+(\.\d+)?)?(\.\w+)?\.(js|css)$ | ||||
| - (^|/)jquery\.(ui|effects)\.([^.]*)\.(js|css)$ | ||||
|  | ||||
| # Prototype | ||||
| - (^|/)prototype(.*)\.js$ | ||||
| @@ -100,18 +116,21 @@ | ||||
| - (^|/)shLegacy\.js$ | ||||
|  | ||||
| # AngularJS | ||||
| - (^|/)angular([^.]*)(\.min)?\.js$ | ||||
| - (^|/)angular([^.]*)\.js$ | ||||
|  | ||||
| # D3.js | ||||
| - (^|\/)d3(\.v\d+)?([^.]*)(\.min)?\.js$ | ||||
| - (^|\/)d3(\.v\d+)?([^.]*)\.js$ | ||||
|  | ||||
| # React | ||||
| - (^|/)react(-[^.]*)?(\.min)?\.js$ | ||||
| - (^|/)react(-[^.]*)?\.js$ | ||||
|  | ||||
| # Modernizr | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?(\.min)?\.js$ | ||||
| - (^|/)modernizr\-\d\.\d+(\.\d+)?\.js$ | ||||
| - (^|/)modernizr\.custom\.\d+\.js$ | ||||
|  | ||||
| # Knockout | ||||
| - (^|/)knockout-(\d+\.){3}(debug\.)?js$ | ||||
|  | ||||
| ## Python ## | ||||
|  | ||||
| # django | ||||
| @@ -148,8 +167,8 @@ | ||||
| - \.intellisense\.js$ | ||||
|  | ||||
| # jQuery validation plugin (MS bundles this with asp.net mvc) | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax(\.min)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.validate(\.unobtrusive)?\.js$ | ||||
| - (^|/)jquery([^.]*)\.unobtrusive\-ajax\.js$ | ||||
|  | ||||
| # Microsoft Ajax | ||||
| - (^|/)[Mm]icrosoft([Mm]vc)?([Aa]jax|[Vv]alidation)(\.debug)?\.js$ | ||||
| @@ -176,7 +195,7 @@ | ||||
| - (^|/)extjs/welcome/ | ||||
|  | ||||
| # Html5shiv | ||||
| - (^|/)html5shiv(\.min)?\.js$ | ||||
| - (^|/)html5shiv\.js$ | ||||
|  | ||||
| # Samples folders | ||||
| - ^[Ss]amples/ | ||||
| @@ -195,8 +214,11 @@ | ||||
| - ^[Tt]est/fixtures/ | ||||
|  | ||||
| # PhoneGap/Cordova | ||||
| - (^|/)cordova([^.]*)(\.min)?\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?(\.min)?\.js$ | ||||
| - (^|/)cordova([^.]*)\.js$ | ||||
| - (^|/)cordova\-\d\.\d(\.\d)?\.js$ | ||||
|  | ||||
| # Foundation js | ||||
| - foundation(\..*)?\.js$ | ||||
|  | ||||
| # Vagrant | ||||
| - ^Vagrantfile$ | ||||
| @@ -213,5 +235,12 @@ | ||||
|  | ||||
| # Octicons | ||||
| - octicons.css | ||||
| - octicons.min.css | ||||
| - sprockets-octicons.scss | ||||
|  | ||||
| # Typesafe Activator | ||||
| - (^|/)activator$ | ||||
| - (^|/)activator\.bat$ | ||||
|  | ||||
| # ProGuard | ||||
| - proguard.pro | ||||
| - proguard-rules.pro | ||||
|   | ||||
| @@ -1,3 +1,3 @@ | ||||
| module Linguist | ||||
|   VERSION = "3.1.1" | ||||
|   VERSION = "3.5.2" | ||||
| end | ||||
|   | ||||
							
								
								
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										521
									
								
								samples/AGS Script/GlobalScript.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,521 @@ | ||||
| // main global script file | ||||
|  | ||||
| // A function that initializes a bunch of stuff. | ||||
| function initialize_control_panel() {  | ||||
|   // Centre the control panel | ||||
|   gPanel.Centre();  | ||||
|   // Centre the Restart dialog as well | ||||
|   gRestartYN.Centre();  | ||||
|   if (!IsSpeechVoxAvailable()) {  | ||||
|     // If there is no speech-vox file, and therefore no speech, | ||||
|     // disable all the controls related with speech. | ||||
|     lblVoice.Visible = false;   | ||||
|     btnVoice.Visible = false;   | ||||
|     sldVoice.Visible = false; | ||||
|   } | ||||
|   else { | ||||
|     // If there *is*, then set it to voice and text. It's best to use | ||||
|     // both whenever possible, for the player's sake. | ||||
|     SetVoiceMode(eSpeechVoiceAndText);  | ||||
|     // And reflect this in the control panel. | ||||
|     btnVoice.Text = "Voice and Text";  | ||||
|   } | ||||
|   if (!System.SupportsGammaControl) { | ||||
|     // If we can't change the gamma settings, disable the relevant options. | ||||
|     sldGamma.Visible = false;  | ||||
|     lblGamma.Visible = false; | ||||
|   }  | ||||
|    | ||||
|   //And now, set all the defaults | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   SetGameSpeed(40); | ||||
|   sldSpeed.Value = 40; | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // Called when the game starts, before the first room is loaded | ||||
| function game_start() {    | ||||
|   // Put the code all in a function and then just call the function.  | ||||
|   // It saves cluttering up places like game_start. | ||||
|   initialize_control_panel();  | ||||
|   // Use the KeyboardMovement module to, per default, replicate the standard | ||||
|   // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info | ||||
|   KeyboardMovement.SetMode(eKeyboardMovement_Tapping);  | ||||
| } | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|    | ||||
|   // Put here anything you want to happen every game cycle, even when | ||||
|   // the game is paused. This will not run when the game is blocked | ||||
|   // inside a command like a blocking Walk() | ||||
|    | ||||
|   if (IsGamePaused() == 1) return; | ||||
|  | ||||
|   // Put here anything you want to happen every game cycle, but not | ||||
|   // when the game is paused. | ||||
| } | ||||
|  | ||||
| function repeatedly_execute_always() { | ||||
|    | ||||
|   // Put anything you want to happen every game cycle, even | ||||
|   // when the game is blocked inside a command like a | ||||
|   // blocking Walk(). | ||||
|   // You cannot run blocking commands from this function. | ||||
|    | ||||
| } | ||||
|  | ||||
| function show_inventory_window ()  | ||||
| { | ||||
|   gInventory.Visible = true; | ||||
|   // switch to the Use cursor (to select items with) | ||||
|   mouse.Mode = eModeInteract; | ||||
|   // But, override the appearance to look like the arrow | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function show_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = true; | ||||
|   // Get the list of save games | ||||
|   lstSaveGamesList.FillSaveGameList(); | ||||
|   if (lstSaveGamesList.ItemCount > 0) | ||||
|   { | ||||
|     // If there is at least one, set the default text | ||||
|     // to be the first game's name | ||||
|     txtNewSaveName.Text = lstSaveGamesList.Items[0]; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     // No save games yet, default empty text. | ||||
|     txtNewSaveName.Text = ""; | ||||
|   } | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function show_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = true; | ||||
|   lstRestoreGamesList.FillSaveGameList(); | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
|   gIconbar.Visible = false; | ||||
| } | ||||
|  | ||||
| function close_save_game_dialog() | ||||
| { | ||||
|   gSaveGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function close_restore_game_dialog() | ||||
| { | ||||
|   gRestoreGame.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| // Called when a key is pressed. keycode holds the key's ASCII code | ||||
| function on_key_press(eKeyCode keycode) { | ||||
|   // The following is called before "if game is paused keycode=0", so | ||||
|   // it'll happen even when the game is paused. | ||||
|    | ||||
|   if ((keycode == eKeyEscape) && gRestartYN.Visible) { | ||||
|     //Use ESC to cancel restart. | ||||
|     gRestartYN.Visible = false;  | ||||
|     gIconbar.Visible = true; | ||||
|     // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|     // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|     // because it's already a pointer. Get used to thinking like this!! | ||||
|     if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && gPanel.Visible) { | ||||
|     // Use ESC to turn the panel off. | ||||
|     gPanel.Visible = false;  | ||||
|     mouse.UseDefaultGraphic(); | ||||
|     gIconbar.Visible = true; | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gSaveGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the save game dialog | ||||
|     close_save_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|   if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) | ||||
|   { | ||||
|     // Use ESC to close the restore game dialog | ||||
|     close_restore_game_dialog(); | ||||
|     return; | ||||
|   } | ||||
|    | ||||
|   if (keycode == eKeyReturn) {  | ||||
|     // ENTER, in this case merely confirms restart | ||||
|     if (gRestartYN.Visible) RestartGame(); | ||||
|   } | ||||
|  | ||||
|   if (IsGamePaused() || (IsInterfaceEnabled() == 0)) | ||||
|   { | ||||
|     // If the game is paused with a modal GUI on the | ||||
|     // screen, or the player interface is disabled in | ||||
|     // a cut scene, ignore any keypresses. | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // FUNCTION KEYS AND SYSTEM SHORTCUTS | ||||
|   if (keycode == eKeyEscape) { | ||||
|     // ESC | ||||
|     gPanel.Visible = true;  | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyCtrlQ)  QuitGame(1);   // Ctrl-Q | ||||
|   if (keycode == eKeyF5) show_save_game_dialog();   // F5 | ||||
|   if (keycode == eKeyF7) show_restore_game_dialog();  // F7 | ||||
|   if (keycode == eKeyF9) { | ||||
|     // F9, asks the player to confirm restarting (so much better to always confirm first) | ||||
|     gRestartYN.Visible = true;   | ||||
|     gIconbar.Visible = false; | ||||
|     mouse.UseModeGraphic(eModePointer); | ||||
|   } | ||||
|   if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp");  // F12 | ||||
|   if (keycode == eKeyTab)   show_inventory_window();  // Tab, show inventory | ||||
|  | ||||
|   // GAME COMMAND SHORTCUTS | ||||
|   if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. | ||||
|   if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. | ||||
|   if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, | ||||
|   if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. | ||||
|   if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. | ||||
|  | ||||
|   // For extra cursor modes, such as pick up, feel free to add as you will. | ||||
|   // Uncomment the line below if you use the "Pick Up" mode. | ||||
|   //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup;  | ||||
|  | ||||
|   // DEBUG FUNCTIONS | ||||
|   if (keycode == eKeyCtrlS)  Debug(0,0);  // Ctrl-S, give all inventory | ||||
|   if (keycode == eKeyCtrlV)  Debug(1,0);  // Ctrl-V, version | ||||
|   if (keycode == eKeyCtrlA)  Debug(2,0);  // Ctrl-A, show walkable areas | ||||
|   if (keycode == eKeyCtrlX)  Debug(3,0);  // Ctrl-X, teleport to room | ||||
|   if (keycode == eKeyCtrlW && game.debug_mode)  | ||||
|     player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area  | ||||
| } | ||||
|  | ||||
|  | ||||
| function on_mouse_click(MouseButton button) { | ||||
|   // called when a mouse button is clicked. button is either LEFT or RIGHT | ||||
|   if (IsGamePaused() == 1) { | ||||
|     // Game is paused, so do nothing (ie. don't allow mouse click) | ||||
|   } | ||||
|   else if (button == eMouseLeft) { | ||||
|     ProcessClick(mouse.x, mouse.y, mouse.Mode ); | ||||
|   } | ||||
|   else if (button == eMouseRight || button == eMouseWheelSouth){ | ||||
|     // right-click our mouse-wheel down, so cycle cursor | ||||
|     mouse.SelectNextMode(); | ||||
|   } | ||||
|   else if (button == eMouseMiddle) {  | ||||
|     // Middle-button-click, default make character walk to clicked area (a little shortcut) | ||||
|     // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to | ||||
|     // leave our options open - what if you have a special script triggered | ||||
|     // on "walking" mode? | ||||
|     ProcessClick(mouse.x, mouse.y, eModeWalkto);  | ||||
|   } | ||||
|   else if (button == eMouseWheelNorth) {  | ||||
|     // Mouse-wheel up, cycle cursors  | ||||
|     // If mode isn't WALK, set the previous mode (notice usage of numbers instead | ||||
|     // of eNums, when it suits us)... | ||||
|     if (mouse.Mode>0) mouse.Mode=mouse.Mode-1;  | ||||
|     else  | ||||
|     {  | ||||
|       // ...but if it is WALK mode... | ||||
|       if (player.ActiveInventory!=null)  | ||||
|       { | ||||
|         //...and the player has a selected inventory item, set mouse mode to UseInv.  | ||||
|         mouse.Mode=eModeUseinv;  | ||||
|       } | ||||
|       else  | ||||
|       { | ||||
|         // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) | ||||
|         mouse.Mode=eModeTalkto;  | ||||
|       } | ||||
|     } | ||||
|   } | ||||
| } | ||||
|  | ||||
| function interface_click(int interface, int button) { | ||||
|   // This function is obsolete, from 2.62 and earlier versions. | ||||
| } | ||||
|  | ||||
| function btnInvUp_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollUp(); | ||||
| } | ||||
|  | ||||
| function btnInvDown_Click(GUIControl *control, MouseButton button) { | ||||
|   invCustomInv.ScrollDown(); | ||||
| } | ||||
|  | ||||
| function btnInvOK_Click(GUIControl *control, MouseButton button) { | ||||
| 	// They pressed the OK button, close the GUI | ||||
| 	gInventory.Visible = false; | ||||
| 	mouse.UseDefaultGraphic(); | ||||
| } | ||||
|  | ||||
| function btnInvSelect_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
| 	// They pressed SELECT, so switch to the Get cursor | ||||
| 	mouse.Mode = eModeInteract; | ||||
| 	// But, override the appearance to look like the arrow | ||||
| 	mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnIconInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   show_inventory_window(); | ||||
| } | ||||
|  | ||||
| function btnIconCurInv_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   if (player.ActiveInventory != null) | ||||
|     mouse.Mode = eModeUseinv; | ||||
| } | ||||
|  | ||||
| function btnIconSave_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconLoad_Click(GUIControl *control, MouseButton button)  | ||||
| { | ||||
|   show_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnIconExit_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   QuitGame(1); | ||||
| } | ||||
|  | ||||
| function btnIconAbout_Click(GUIControl *control, MouseButton button) { | ||||
|    | ||||
|   gPanel.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function cEgo_Look() | ||||
| { | ||||
|   Display("Damn, I'm looking good!"); | ||||
| } | ||||
|  | ||||
| function cEgo_Interact() | ||||
| { | ||||
|   Display("You rub your hands up and down your clothes."); | ||||
| } | ||||
|  | ||||
| function cEgo_Talk() | ||||
| { | ||||
|   Display("Talking to yourself is a sign of madness!"); | ||||
| } | ||||
|  | ||||
| //START OF CONTROL PANEL FUNCTIONS | ||||
| function btnSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconSave_Click(btnIconSave, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function gControl_OnClick(GUI *theGui, MouseButton button) | ||||
| { | ||||
|  | ||||
| } | ||||
|  | ||||
| function btnAbout_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
| Display("Adventure Game Studio run-time engine default game."); | ||||
| } | ||||
|  | ||||
| function btnQuit_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   Wait(1); | ||||
|   QuitGame(1); | ||||
|   gPanel.Visible = true; | ||||
|   gIconbar.Visible = false; | ||||
|   mouse.UseModeGraphic(eModePointer); | ||||
| } | ||||
|  | ||||
| function btnLoad_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
|   Wait(1); | ||||
|   btnIconLoad_Click(btnIconLoad, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnResume_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gPanel.Visible = false; | ||||
|   mouse.UseDefaultGraphic(); | ||||
|   gIconbar.Visible = true; | ||||
| } | ||||
|  | ||||
| function sldAudio_OnChange(GUIControl *control) | ||||
| { | ||||
|   System.Volume = sldAudio.Value; | ||||
| } | ||||
|  | ||||
| function sldVoice_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Sets voice volume. Note that we don't check for the existence of speech.vox -  | ||||
|   // we did that in game_start, so if it's not there the slider won't even be available. | ||||
|   SetSpeechVolume(sldVoice.Value);  | ||||
| } | ||||
|  | ||||
| function btnVoice_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Note that we don't check for the existence of speech.vox - we did that in game_start, | ||||
|   // so if it's not there the button won't even be available. | ||||
|   if (btnVoice.Text == "Voice and Text") {  | ||||
|     SetVoiceMode(eSpeechVoiceOnly);  | ||||
|     btnVoice.Text = "Voice only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Voice only") { | ||||
|     SetVoiceMode(eSpeechTextOnly); | ||||
|     btnVoice.Text = "Text only"; | ||||
|   } | ||||
|   else if (btnVoice.Text == "Text only") { | ||||
|     SetVoiceMode(eSpeechVoiceAndText); | ||||
|     btnVoice.Text = "Voice and Text"; | ||||
|   } | ||||
| } | ||||
|  | ||||
| function sldGamma_OnChange(GUIControl *control) | ||||
| { | ||||
|   // Set the gamma. Note there's no need to check for anything else, as we ensured, | ||||
|   // in game_start, that the slider won't even appear if it's not possible to do this. | ||||
|   System.Gamma = sldGamma.Value;  | ||||
| } | ||||
|  | ||||
| function btnDefault_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   // Reset everything to default. You'll have to edit these as well as the sliders | ||||
|   // if you'd rather have different default parameters. | ||||
|   System.Volume = 100; | ||||
|   sldAudio.Value = System.Volume; | ||||
|   sldSpeed.Value = 40; | ||||
|   SetGameSpeed(40); | ||||
|   if (IsSpeechVoxAvailable()) { | ||||
|      SetVoiceMode(eSpeechVoiceAndText); | ||||
|      btnVoice.Text = "Voice and Text"; | ||||
|      sldVoice.Value = 255; | ||||
|      SetSpeechVolume(255); | ||||
|   } | ||||
|   if (System.SupportsGammaControl) { | ||||
|     System.Gamma = 100; | ||||
|     sldGamma.Value = 100; | ||||
|   } | ||||
| } | ||||
| //END OF CONTROL PANEL FUNCTIONS | ||||
|  | ||||
| function dialog_request(int param)  | ||||
| { | ||||
|   // This is used by the dialog text parser if you need to process | ||||
|   // text that the player types in to the parser. | ||||
|   // It is not used by default. | ||||
| } | ||||
|  | ||||
| function sldSpeed_OnChange(GUIControl *control) | ||||
| { | ||||
|   SetGameSpeed(sldSpeed.Value); | ||||
| } | ||||
|  | ||||
| function btnRestart_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible=true; | ||||
|   gIconbar.Visible=false; | ||||
| } | ||||
|  | ||||
| function btnRestartYes_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   RestartGame(); | ||||
| } | ||||
|  | ||||
| function btnRestartNo_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   gRestartYN.Visible = false; | ||||
|   gIconbar.Visible = true; | ||||
|   // If the panel's not ON, then the player must have gotten here by tapping F9, | ||||
|   // therefore his cursor needs restoring. If the panel IS on, then it doesn't, | ||||
|   // because it's already a pointer. Get used to thinking like this!! | ||||
|   if (!gPanel.Visible) mouse.UseDefaultGraphic();  | ||||
| } | ||||
|  | ||||
| function btnCancelSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnSaveGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; | ||||
|   int i = 0; | ||||
|   while (i < lstSaveGamesList.ItemCount) | ||||
|   { | ||||
|     if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) | ||||
|     { | ||||
|       gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; | ||||
|     } | ||||
|     i++; | ||||
|   } | ||||
|   SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); | ||||
|   close_save_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstRestoreGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); | ||||
|   } | ||||
|   close_restore_game_dialog(); | ||||
| } | ||||
|  | ||||
| function lstSaveGamesList_OnSelectionCh(GUIControl *control) | ||||
| { | ||||
|   txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; | ||||
| } | ||||
|  | ||||
| function txtNewSaveName_OnActivate(GUIControl *control) | ||||
| { | ||||
|   // Pressing return in the text box simulates clicking the Save button | ||||
|   btnSaveGame_OnClick(control, eMouseLeft); | ||||
| } | ||||
|  | ||||
| function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) | ||||
| { | ||||
|   if (lstSaveGamesList.SelectedIndex >= 0) | ||||
|   { | ||||
|     DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); | ||||
|     lstSaveGamesList.FillSaveGameList(); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								samples/AGS Script/GlobalScript.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,4 @@ | ||||
| // Main header script - this will be included into every script in | ||||
| // the game (local and global). Do not place functions here; rather, | ||||
| // place import definitions and #define names here to be used by all | ||||
| // scripts. | ||||
							
								
								
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/AGS Script/KeyboardMovement_102.asc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
| // Main script for module 'KeyboardMovement' | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // DEFINITIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| #define DISTANCE 10000// distance player walks in Tapping mode before he stops | ||||
|  | ||||
| enum KeyboardMovement_Directions { | ||||
| 	eKeyboardMovement_Stop,  | ||||
| 	eKeyboardMovement_DownLeft,  | ||||
| 	eKeyboardMovement_Down,  | ||||
| 	eKeyboardMovement_DownRight,  | ||||
| 	eKeyboardMovement_Left,  | ||||
| 	eKeyboardMovement_Right,  | ||||
| 	eKeyboardMovement_UpLeft,  | ||||
| 	eKeyboardMovement_Up,  | ||||
| 	eKeyboardMovement_UpRight | ||||
| }; | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // VARIABLES | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| // keycodes as variables for future key customization functions (static variables?): | ||||
| int KeyboardMovement_KeyDown = 380; // down arrow | ||||
| int KeyboardMovement_KeyLeft = 375; // left arrow | ||||
| int KeyboardMovement_KeyRight = 377; // right arrow | ||||
| int KeyboardMovement_KeyUp = 372; // up arrow | ||||
| int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) | ||||
| int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) | ||||
| int KeyboardMovement_KeyDownLeft = 379; // End (numpad) | ||||
| int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) | ||||
| int KeyboardMovement_KeyStop = 376; // 5 (numpad) | ||||
|  | ||||
| KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) | ||||
|  | ||||
| KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // USER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { | ||||
| 	KeyboardMovement_Mode = mode; | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| // key customization functions here | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| //**************************************************************************************************** | ||||
| // EVENT HANDLER FUNCTIONS | ||||
| //**************************************************************************************************** | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function repeatedly_execute() { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Pressing mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) | ||||
| 	else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow | ||||
| 	else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow | ||||
| 	else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character | ||||
|  | ||||
| 	if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_key_press(int keycode) { | ||||
|  | ||||
| 	//-------------------------------------------------- | ||||
| 	// Tapping mode | ||||
| 	//-------------------------------------------------- | ||||
|  | ||||
| 	if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; | ||||
| 	  // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function | ||||
|  | ||||
| 	KeyboardMovement_Directions newdirection; // declare variable storing new direction | ||||
|  | ||||
| 	// get new direction: | ||||
| 	if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right | ||||
| 	else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; | ||||
| 	else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; | ||||
| 	else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; | ||||
| 	else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; | ||||
| 	else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; | ||||
| 	else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; | ||||
| 	else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character | ||||
|  | ||||
| 	if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction | ||||
|  | ||||
| 		if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character | ||||
| 		else { // if new direction is NOT the Stop command | ||||
|  | ||||
| 			int dx, dy; // declare variables storing new walk coordinates | ||||
| 			if (newdirection == eKeyboardMovement_DownRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpRight) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_DownLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_UpLeft) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Down) { | ||||
| 				dx = 0; | ||||
| 				dy = DISTANCE; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Left) { | ||||
| 				dx = -DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Right) { | ||||
| 				dx = DISTANCE; | ||||
| 				dy = 0; | ||||
| 			} | ||||
| 			else if (newdirection == eKeyboardMovement_Up) { | ||||
| 				dx = 0; | ||||
| 				dy = -DISTANCE; | ||||
| 			} | ||||
|  | ||||
| 			player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates | ||||
| 		} | ||||
| 		KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction | ||||
|  | ||||
| 	} | ||||
| 	else { // if new direction is same as current direction | ||||
| 		player.StopMoving(); // stop player character | ||||
| 		KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction | ||||
| 	} | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
|  | ||||
| function on_event(EventType event, int data) { | ||||
|  | ||||
| 	if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; | ||||
|  | ||||
| } | ||||
|  | ||||
| //==================================================================================================== | ||||
							
								
								
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/AGS Script/KeyboardMovement_102.ash
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| // Script header for module 'KeyboardMovement' | ||||
|  | ||||
| #define KeyboardMovement_VERSION 101 | ||||
|  | ||||
| enum KeyboardMovement_Modes { | ||||
| 	eKeyboardMovement_None,  | ||||
| 	eKeyboardMovement_Tapping,  | ||||
| 	eKeyboardMovement_Pressing | ||||
| }; | ||||
|  | ||||
| struct KeyboardMovement { | ||||
| 	import static function SetMode(KeyboardMovement_Modes mode); | ||||
| }; | ||||
							
								
								
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/APL/DeepakChopra.apl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| ⍝   You can try this at http://tryapl.org/ | ||||
| ⍝   I can not explain how much I suddenly love this crypto-language | ||||
|  | ||||
|  | ||||
|  | ||||
| Starts     ← 'Experiential truth ' 'The physical world ' 'Non-judgment '       'Quantum physics ' | ||||
| Middles    ← 'nurtures an '        'projects onto '      'imparts reality to ' 'constructs with ' | ||||
| Qualifiers ← 'abundance of '       'the barrier of '     'self-righteous '     'potential ' | ||||
| Finishes   ← 'marvel.'             'choices.'            'creativity.'         'actions.' | ||||
|  | ||||
| rf     ← {(?⍴⍵)⊃⍵} | ||||
| erf    ← {rf ¨ ⍵} | ||||
|  | ||||
| deepak ← {erf Starts Middles Qualifiers Finishes} | ||||
|  | ||||
|  | ||||
|  | ||||
| deepak ⍬ | ||||
							
								
								
									
										367
									
								
								samples/APL/UT.dyalog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										367
									
								
								samples/APL/UT.dyalog
									
									
									
									
									
										Normal 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 16⊤attr           ⍝ 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 | ||||
							
								
								
									
										66
									
								
								samples/Assembly/External Interrupt.a51
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								samples/Assembly/External Interrupt.a51
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										10
									
								
								samples/C++/bar.hh
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| class Bar | ||||
| { | ||||
|   protected: | ||||
|  | ||||
|     char *name; | ||||
|  | ||||
|   public: | ||||
|  | ||||
|     void hello(); | ||||
| } | ||||
| @@ -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; | ||||
|   | ||||
							
								
								
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										304
									
								
								samples/Chapel/distributions.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,304 @@ | ||||
| // | ||||
| // Distributions Primer | ||||
| // | ||||
| // This primer demonstrates uses of some of Chapel's standard | ||||
| // distributions.  To use these distributions in a Chapel program, | ||||
| // the respective module must be used: | ||||
| // | ||||
| use BlockDist, CyclicDist, BlockCycDist, ReplicatedDist; | ||||
| use DimensionalDist2D, ReplicatedDim, BlockCycDim; | ||||
|  | ||||
| // | ||||
| // For each distribution, we'll create a distributed domain and array | ||||
| // and then initialize it just to give a brief flavor of how the | ||||
| // distribution maps across locales.  Running this example on 6 | ||||
| // locales does a nice job of illustrating the distribution | ||||
| // characteristics. | ||||
| // | ||||
| // All of these distributions support options to map to a different | ||||
| // virtual locale grid than the one used by default (a | ||||
| // multidimensional factoring of the built-in Locales array), as well | ||||
| // as to control the amount of parallelism used in data parallel | ||||
| // loops.  See the Standard Distributions chapter of the language spec | ||||
| // for more details. | ||||
| // | ||||
|  | ||||
| // | ||||
| // Make the program size configurable from the command line. | ||||
| // | ||||
| config const n = 8; | ||||
|  | ||||
| // | ||||
| // Declare a 2-dimensional domain Space that we will later use to | ||||
| // initialize the distributed domains. | ||||
| // | ||||
| const Space = {1..n, 1..n}; | ||||
|  | ||||
| // | ||||
| // The Block distribution distributes a bounding box from | ||||
| // n-dimensional space across the target locale array viewed as an | ||||
| // n-dimensional virtual locale grid.  The bounding box is blocked | ||||
| // into roughly equal portions across the locales.  Note that domains | ||||
| // declared over a Block distribution can also store indices outside | ||||
| // of the bounding box; the bounding box is merely used to compute | ||||
| // the blocking of space. | ||||
| // | ||||
| // In this example, we declare a 2-dimensional Block-distributed | ||||
| // domain BlockSpace and a Block-distributed array BA declared over | ||||
| // the domain. | ||||
| // | ||||
| const BlockSpace = Space dmapped Block(boundingBox=Space); | ||||
| var BA: [BlockSpace] int; | ||||
|  | ||||
| // | ||||
| // To illustrate how the index set is distributed across locales, | ||||
| // we'll use a forall loop to initialize each array element to the | ||||
| // locale ID that stores that index/element/iteration. | ||||
| // | ||||
| forall ba in BA do | ||||
|   ba = here.id; | ||||
|  | ||||
| // | ||||
| // Output the Block-distributed array to visually see how the elements | ||||
| // are partitioned across the locales. | ||||
| // | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Most of Chapel's standard distributions support an optional | ||||
| // targetLocales argument that permits you to pass in your own | ||||
| // array of locales to be targeted.  In general, the targetLocales | ||||
| // argument should match the rank of the distribution.  So for | ||||
| // example, to map a Block to a [numLocales x 1] view of the | ||||
| // locale set, one could do something like this: | ||||
|  | ||||
| // | ||||
| // We start by creating our own array of the locale values.  Here | ||||
| // we use the standard array reshape function for convenience, | ||||
| // but more generally, this array could be accessed/assigned like any | ||||
| // other. | ||||
| // | ||||
|  | ||||
| var MyLocaleView = {0..#numLocales, 1..1}; | ||||
| var MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView); | ||||
|  | ||||
| // | ||||
| // Then we'll declare a distributed domain/array that targets | ||||
| // this view of the locales: | ||||
| //  | ||||
|  | ||||
| const BlockSpace2 = Space dmapped Block(boundingBox=Space, | ||||
|                                         targetLocales=MyLocales); | ||||
| var BA2: [BlockSpace2] int; | ||||
|  | ||||
| // | ||||
| // Then we'll do a similar computation as before to verify where | ||||
| // everything ended up: | ||||
| // | ||||
| forall ba in BA2 do | ||||
|   ba = here.id; | ||||
|  | ||||
| writeln("Block Array Index Map"); | ||||
| writeln(BA2); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll perform a similar computation for the Cyclic distribution. | ||||
| // Cyclic distributions start at a designated n-dimensional index and | ||||
| // distribute the n-dimensional space across an n-dimensional array | ||||
| // of locales in a round-robin fashion (in each dimension).  As with | ||||
| // the Block distribution, domains may be declared using the | ||||
| // distribution who have lower indices that the starting index; that | ||||
| // value should just be considered a parameterization of how the | ||||
| // distribution is defined. | ||||
| // | ||||
| const CyclicSpace = Space dmapped Cyclic(startIdx=Space.low); | ||||
| var CA: [CyclicSpace] int; | ||||
|  | ||||
| forall ca in CA do | ||||
|   ca = here.id; | ||||
|  | ||||
| writeln("Cyclic Array Index Map"); | ||||
| writeln(CA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // Next, we'll declare a Block-Cyclic distribution.  These | ||||
| // distributions also deal out indices in a round-robin fashion, | ||||
| // but rather than dealing out singleton indices, they deal out blocks | ||||
| // of indices.  Thus, the BlockCyclic distribution is parameterized | ||||
| // by a starting index (as with Cyclic) and a block size (per | ||||
| // dimension) specifying how large the chunks to be dealt out are. | ||||
| //  | ||||
| const BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low,  | ||||
|                                               blocksize=(2, 3)); | ||||
| var BCA: [BlkCycSpace] int; | ||||
|  | ||||
| forall bca in BCA do | ||||
|   bca = here.id; | ||||
|  | ||||
| writeln("Block-Cyclic Array Index Map"); | ||||
| writeln(BCA); | ||||
| writeln(); | ||||
|  | ||||
|  | ||||
| // | ||||
| // The ReplicatedDist distribution is different: each of the | ||||
| // original domain's indices - and the corresponding array elements - | ||||
| // is replicated onto each locale. (Note: consistency among these | ||||
| // array replicands is NOT maintained automatically.) | ||||
| // | ||||
| // This replication is observable in some cases but not others, | ||||
| // as shown below. Note: this behavior may change in the future. | ||||
| // | ||||
| const ReplicatedSpace = Space dmapped ReplicatedDist(); | ||||
| var RA: [ReplicatedSpace] int; | ||||
|  | ||||
| // The replication is observable - this visits each replicand. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| writeln("Replicated Array Index Map, ", RA.numElements, " elements total"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // The replication is observable when the replicated array is | ||||
| // on the left-hand side. If the right-hand side is not replicated, | ||||
| // it is copied into each replicand. | ||||
| // We illustrate this using a non-distributed array. | ||||
| // | ||||
| var A: [Space] int = [(i,j) in Space] i*100 + j; | ||||
| RA = A; | ||||
| writeln("Replicated Array after being array-assigned into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // Analogously, each replicand will be visited and | ||||
| // other participated expressions will be computed on each locale | ||||
| // (a) when the replicated array is assigned a scalar: | ||||
| //       RA = 5; | ||||
| // (b) when it appears first in a zippered forall loop: | ||||
| //       forall (ra, a) in zip(RA, A) do ...; | ||||
| // (c) when it appears in a for loop: | ||||
| //       for ra in RA do ...; | ||||
| // | ||||
| // Zippering (RA,A) or (A,RA) in a 'for' loop will generate | ||||
| // an error due to their different number of elements. | ||||
|  | ||||
| // Let RA store the Index Map again, for the examples below. | ||||
| forall ra in RA do | ||||
|   ra = here.id; | ||||
|  | ||||
| // | ||||
| // Only the local replicand is accessed - replication is NOT observable | ||||
| // and consistency is NOT maintained - when: | ||||
| // (a) the replicated array is indexed - an individual element is read... | ||||
| // | ||||
| on Locales(0) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| on Locales(LocaleSpace.high) do | ||||
|   writeln("on ", here, ": ", RA(Space.low)); | ||||
| writeln(); | ||||
|  | ||||
| // ...or an individual element is written; | ||||
| on Locales(LocaleSpace.high) do | ||||
|   RA(Space.low) = 7777; | ||||
|  | ||||
| writeln("Replicated Array after being indexed into"); | ||||
| writeln(RA); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (b) the replicated array is on the right-hand side of an assignment... | ||||
| // | ||||
| on Locales(LocaleSpace.high) do | ||||
|   A = RA + 4; | ||||
| writeln("Non-Replicated Array after assignment from Replicated Array + 4"); | ||||
| writeln(A); | ||||
| writeln(); | ||||
|  | ||||
| // | ||||
| // (c) ...or, generally, the replicated array or domain participates | ||||
| //     in a zippered forall loop, but not in the first position. | ||||
| //     The loop could look like: | ||||
| // | ||||
| //       forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...; | ||||
| // | ||||
|  | ||||
|  | ||||
| // | ||||
| // The DimensionalDist2D distribution lets us build a 2D distribution | ||||
| // as a composition of specifiers for individual dimensions. | ||||
| // Under such a "dimensional" distribution each dimension is handled | ||||
| // independently of the other. | ||||
| // | ||||
| // The dimension specifiers are similar to the corresponding multi-dimensional | ||||
| // distributions in constructor arguments and index-to-locale mapping rules. | ||||
| // However, instead of an array of locales, a specifier constructor | ||||
| // accepts just the number of locales that the indices in the corresponding | ||||
| // dimension will be distributed across. | ||||
| // | ||||
| // The DimensionalDist2D constructor requires: | ||||
| // * an [0..nl1-1, 0..nl2-1] array of locales, where | ||||
| //   nl1 and nl2 are the number of locales in each dimension, and | ||||
| // * two dimension specifiers, created for nl1 and nl2 locale counts, resp. | ||||
| // | ||||
| // Presently, the following dimension specifiers are available | ||||
| // (shown here with their constructor arguments): | ||||
| // | ||||
| // * ReplicatedDim(numLocales) | ||||
| // * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh) | ||||
| // * BlockCyclicDim(lowIdx, blockSize, numLocales) | ||||
| // | ||||
|  | ||||
| // | ||||
| // The following example creates a dimensional distribution that | ||||
| // replicates over 2 locales (when available) in the first dimemsion | ||||
| // and distributes using block-cyclic distribution in the second dimension. | ||||
| // The example computes nl1 and nl2 and reshapes MyLocales correspondingly. | ||||
| // | ||||
|  | ||||
| var (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2); | ||||
| MyLocaleView = {0..#nl1, 0..#nl2}; | ||||
| MyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView); | ||||
|  | ||||
| const DimReplicatedBlockcyclicSpace = Space | ||||
|   dmapped DimensionalDist2D(MyLocales, | ||||
|                             new ReplicatedDim(numLocales = nl1), | ||||
|                             new BlockCyclicDim(numLocales = nl2, | ||||
|                                                lowIdx = 1, blockSize = 2)); | ||||
|  | ||||
| var DRBA: [DimReplicatedBlockcyclicSpace] int; | ||||
|  | ||||
| // The ReplicatedDim specifier always accesses the local replicand. | ||||
| // (This differs from how the ReplicatedDist distribution works.) | ||||
| // | ||||
| // This example visits each replicand. The behavior is the same | ||||
| // regardless of the second index into MyLocales below. | ||||
|  | ||||
| for locId1 in 0..#nl1 do on MyLocales[locId1, 0] { | ||||
|  | ||||
|   forall drba in DRBA do | ||||
|     drba = here.id; | ||||
|  | ||||
|   writeln("Dimensional2D(Replicated,BlockCyclic) Array Index Map", | ||||
|           " from ", here); | ||||
|  | ||||
|   // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0. | ||||
|   // Since we want to see what DRBA contains on the current locale, | ||||
|   // we use 'Helper' that is mapped using the default distribution. | ||||
|   // 'Helper = DRBA' captures the view of DRBA on the current locale, | ||||
|   // which we then print out. | ||||
|  | ||||
|   const Helper: [Space] int = DRBA; | ||||
|   writeln(Helper); | ||||
|   writeln(); | ||||
|  | ||||
| } | ||||
							
								
								
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								samples/Chapel/hello.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| writeln("Hello, world!");    // print 'Hello, world!' to the console | ||||
							
								
								
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1692
									
								
								samples/Chapel/lulesh.chpl
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										147
									
								
								samples/Chapel/nbody.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,147 @@ | ||||
| /* The Computer Language Benchmarks Game | ||||
|    http://benchmarksgame.alioth.debian.org/ | ||||
|  | ||||
|    contributed by Albert Sidelnik | ||||
|    modified by Brad Chamberlain | ||||
| */ | ||||
|  | ||||
|  | ||||
| // | ||||
| // The number of timesteps to simulate; may be set via the command-line | ||||
| // | ||||
| config const n = 10000; | ||||
|  | ||||
| // | ||||
| // Constants representing pi, the solar mass, and the number of days per year | ||||
| // | ||||
| const pi = 3.141592653589793, | ||||
|       solarMass = 4 * pi**2, | ||||
|       daysPerYear = 365.24; | ||||
|  | ||||
| // | ||||
| // a record representing one of the bodies in the solar system | ||||
| // | ||||
| record body { | ||||
|   var pos: 3*real; | ||||
|   var v: 3*real; | ||||
|   var mass: real;  // does not change after it is set up | ||||
| } | ||||
|  | ||||
| // | ||||
| // the array of bodies that we'll be simulating | ||||
| // | ||||
| var bodies = [/* sun */ | ||||
|               new body(mass = solarMass), | ||||
|  | ||||
|               /* jupiter */ | ||||
|               new body(pos = ( 4.84143144246472090e+00, | ||||
|                               -1.16032004402742839e+00, | ||||
|                               -1.03622044471123109e-01), | ||||
|                          v = ( 1.66007664274403694e-03 * daysPerYear, | ||||
|                                7.69901118419740425e-03 * daysPerYear, | ||||
|                               -6.90460016972063023e-05 * daysPerYear), | ||||
|                       mass =   9.54791938424326609e-04 * solarMass), | ||||
|    | ||||
|               /* saturn */ | ||||
|               new body(pos = ( 8.34336671824457987e+00, | ||||
|                                4.12479856412430479e+00, | ||||
|                               -4.03523417114321381e-01), | ||||
|                          v = (-2.76742510726862411e-03 * daysPerYear, | ||||
|                                4.99852801234917238e-03 * daysPerYear, | ||||
|                                2.30417297573763929e-05 * daysPerYear), | ||||
|                       mass =   2.85885980666130812e-04 * solarMass), | ||||
|  | ||||
|               /* uranus */ | ||||
|               new body(pos = ( 1.28943695621391310e+01, | ||||
|                               -1.51111514016986312e+01, | ||||
|                               -2.23307578892655734e-01), | ||||
|                          v = ( 2.96460137564761618e-03 * daysPerYear, | ||||
|                                2.37847173959480950e-03 * daysPerYear, | ||||
|                               -2.96589568540237556e-05 * daysPerYear), | ||||
|                       mass =   4.36624404335156298e-05 * solarMass), | ||||
|  | ||||
|               /* neptune */ | ||||
|               new body(pos = ( 1.53796971148509165e+01, | ||||
|                               -2.59193146099879641e+01, | ||||
|                                1.79258772950371181e-01), | ||||
|                          v = ( 2.68067772490389322e-03 * daysPerYear, | ||||
|                                1.62824170038242295e-03 * daysPerYear, | ||||
|                               -9.51592254519715870e-05 * daysPerYear), | ||||
|                       mass =   5.15138902046611451e-05 * solarMass) | ||||
|               ]; | ||||
|  | ||||
| // | ||||
| // the number of bodies to be simulated | ||||
| // | ||||
| const numbodies = bodies.numElements; | ||||
|  | ||||
| // | ||||
| // The computation involves initializing the sun's velocity, | ||||
| // writing the initial energy, advancing the system through 'n' | ||||
| // timesteps, and writing the final energy. | ||||
| // | ||||
| proc main() { | ||||
|   initSun(); | ||||
|  | ||||
|   writef("%.9r\n", energy()); | ||||
|   for 1..n do | ||||
|     advance(0.01); | ||||
|   writef("%.9r\n", energy()); | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the sun's initial velocity | ||||
| // | ||||
| proc initSun() { | ||||
|   const p = + reduce (for b in bodies do (b.v * b.mass)); | ||||
|   bodies[1].v = -p / solarMass; | ||||
| } | ||||
|  | ||||
| // | ||||
| // advance the positions and velocities of all the bodies | ||||
| // | ||||
| proc advance(dt) { | ||||
|   for i in 1..numbodies { | ||||
|     for j in i+1..numbodies { | ||||
|       updateVelocities(bodies[i], bodies[j]); | ||||
|        | ||||
|       inline proc updateVelocities(ref b1, ref b2) { | ||||
|         const dpos = b1.pos - b2.pos, | ||||
|                mag = dt / sqrt(sumOfSquares(dpos))**3; | ||||
|          | ||||
|         b1.v -= dpos * b2.mass * mag; | ||||
|         b2.v += dpos * b1.mass * mag; | ||||
|       } | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   for b in bodies do | ||||
|     b.pos += dt * b.v; | ||||
| } | ||||
|  | ||||
| // | ||||
| // compute the energy of the bodies | ||||
| // | ||||
| proc energy() { | ||||
|   var e = 0.0; | ||||
|    | ||||
|   for i in 1..numbodies { | ||||
|     const b1 = bodies[i]; | ||||
|      | ||||
|     e += 0.5 * b1.mass * sumOfSquares(b1.v); | ||||
|      | ||||
|     for j in i+1..numbodies { | ||||
|       const b2 = bodies[j]; | ||||
|        | ||||
|       e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos)); | ||||
|     } | ||||
|   } | ||||
|    | ||||
|   return e; | ||||
| } | ||||
|  | ||||
| // | ||||
| // a helper routine to compute the sum of squares of a 3-tuple's components | ||||
| // | ||||
| inline proc sumOfSquares(x) | ||||
|   return x(1)**2 + x(2)**2 + x(3)**2; | ||||
							
								
								
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								samples/Chapel/quicksort.chpl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | ||||
| // | ||||
| // An example of a parallel quick sort implementation that uses | ||||
| // "cobegin" to make each recursive call in parallel and "serial" to | ||||
| // limit the number of threads. | ||||
| // | ||||
|  | ||||
| use Random, Time; // for random number generation and the Timer class | ||||
|  | ||||
| var timer: Timer; // to time the sort | ||||
|  | ||||
| config var n: int = 2**15;      // the size of the array to be sorted | ||||
| config var thresh: int = 1;     // the recursive depth to serialize | ||||
| config var verbose: int = 0;    // print out this many elements in array | ||||
| config var timing: bool = true; // set timing to false to disable timer | ||||
|  | ||||
| var A: [1..n] real; // array of real numbers | ||||
|  | ||||
| // | ||||
| // initialize array with random numbers | ||||
| // | ||||
| fillRandom(A); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // start timer, call parallel quick sort routine, stop timer | ||||
| // | ||||
| if timing then timer.start(); | ||||
| pqsort(A, thresh); | ||||
| if timing then timer.stop(); | ||||
|  | ||||
| // | ||||
| // report sort time | ||||
| // | ||||
| if timing then writeln("sorted in ", timer.elapsed(), " seconds"); | ||||
|  | ||||
| // | ||||
| // print out front of array if verbose flag is set | ||||
| //   values should now be in sorted order | ||||
| // | ||||
| if verbose > 0 then | ||||
|   writeln("A[1..", verbose, "] = ", A[1..verbose]); | ||||
|  | ||||
| // | ||||
| // verify that array is sorted or halt | ||||
| // | ||||
| for i in 2..n do | ||||
|   if A(i) < A(i-1) then | ||||
|     halt("A(", i-1, ") == ", A(i-1), " > A(", i, ") == ", A(i)); | ||||
|  | ||||
| writeln("verification success"); | ||||
|  | ||||
| // | ||||
| // pqsort -- parallel quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   thresh: number of recursive calls to make before serializing | ||||
| //   low: lower bound of array to start sort at, defaults to whole array | ||||
| //   high: upper bound of array to stop sort at, defaults to whole array | ||||
| // | ||||
| proc pqsort(arr: [], | ||||
|            thresh: int, | ||||
|            low: int = arr.domain.low, | ||||
|            high: int = arr.domain.high) where arr.rank == 1 { | ||||
|  | ||||
|   // | ||||
|   // base case: arr[low..high] is small enough to bubble sort | ||||
|   // | ||||
|   if high - low < 8 { | ||||
|     bubbleSort(arr, low, high); | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // determine pivot and partition arr[low..high] | ||||
|   // | ||||
|   const pivotVal = findPivot(); | ||||
|   const pivotLoc = partition(pivotVal); | ||||
|  | ||||
|   // | ||||
|   // make recursive calls to parallel quick sort each unsorted half of | ||||
|   // the array; if thresh is 0 or less, start executing conquer tasks | ||||
|   // serially | ||||
|   // | ||||
|   serial thresh <= 0 do cobegin { | ||||
|     pqsort(arr, thresh-1, low, pivotLoc-1); | ||||
|     pqsort(arr, thresh-1, pivotLoc+1, high); | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // findPivot -- helper routine to find pivot value using simple | ||||
|   //              median-of-3 method, returns pivot value | ||||
|   // | ||||
|   proc findPivot() { | ||||
|     const mid = low + (high-low+1) / 2; | ||||
|  | ||||
|     if arr(mid) < arr(low) then arr(mid) <=> arr(low); | ||||
|     if arr(high) < arr(low) then arr(high) <=> arr(low); | ||||
|     if arr(high) < arr(mid) then arr(high) <=> arr(mid); | ||||
|  | ||||
|     const pivotVal = arr(mid); | ||||
|     arr(mid) = arr(high-1); | ||||
|     arr(high-1) = pivotVal; | ||||
|  | ||||
|     return pivotVal; | ||||
|   } | ||||
|  | ||||
|   // | ||||
|   // partition -- helper routine to partition array such that all | ||||
|   //              values less than pivot are to its left and all | ||||
|   //              values greater than pivot are to its right, returns | ||||
|   //              pivot location | ||||
|   // | ||||
|   proc partition(pivotVal) { | ||||
|     var ilo = low, ihi = high-1; | ||||
|     while (ilo < ihi) { | ||||
|       do { ilo += 1; } while arr(ilo) < pivotVal; | ||||
|       do { ihi -= 1; } while pivotVal < arr(ihi); | ||||
|       if (ilo < ihi) { | ||||
|         arr(ilo) <=> arr(ihi); | ||||
|       } | ||||
|     } | ||||
|     arr(high-1) = arr(ilo); | ||||
|     arr(ilo) = pivotVal; | ||||
|     return ilo; | ||||
|   } | ||||
| } | ||||
|  | ||||
| // | ||||
| // bubbleSort -- bubble sort for base case of quick sort | ||||
| // | ||||
| //   arr: generic 1D array of values (real, int, ...) | ||||
| //   low: lower bound of array to start sort at | ||||
| //   high: upper bound of array to stop sort at | ||||
| // | ||||
| proc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 { | ||||
|   for i in low..high do | ||||
|     for j in low..high-1 do | ||||
|       if arr(j) > arr(j+1) then | ||||
|         arr(j) <=> arr(j+1); | ||||
| } | ||||
							
								
								
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								samples/Clean/GenHylo.dcl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										9
									
								
								samples/Clean/GenMap.dcl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										19
									
								
								samples/Clean/GenMap.icl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										54
									
								
								samples/Clean/fsieve.icl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										99
									
								
								samples/Clean/sem.icl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										14
									
								
								samples/Clean/stack.dcl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										33
									
								
								samples/Clean/stack.icl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										16
									
								
								samples/Clean/streams.dcl
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										49
									
								
								samples/Clean/streams.icl
									
									
									
									
									
										Normal 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) _ _ = [] | ||||
|  | ||||
							
								
								
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								samples/Clojure/index.cljs.hl
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,146 @@ | ||||
| ;; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved. | ||||
| ;; The use and distribution terms for this software are covered by the | ||||
| ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) | ||||
| ;; which can be found in the file epl-v10.html at the root of this distribution. | ||||
| ;; By using this software in any fashion, you are agreeing to be bound by | ||||
| ;; the terms of this license. | ||||
| ;; You must not remove this notice, or any other, from this software. | ||||
|  | ||||
| (page "index.html" | ||||
|   (:refer-clojure :exclude [nth]) | ||||
|   (:require | ||||
|    [tailrecursion.hoplon.reload        :refer [reload-all]] | ||||
|    [tailrecursion.hoplon.util          :refer [nth name pluralize]] | ||||
|    [tailrecursion.hoplon.storage-atom  :refer [local-storage]])) | ||||
|  | ||||
| ;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (declare route state editing) | ||||
|  | ||||
| (reload-all) | ||||
|  | ||||
| (def mapvi  (comp vec map-indexed)) | ||||
|  | ||||
| (defn dissocv [v i] | ||||
|   (let [z (- (dec (count v)) i)] | ||||
|     (cond (neg?  z) v | ||||
|           (zero? z) (pop v) | ||||
|           (pos?  z) (into (subvec v 0 i) (subvec v (inc i)))))) | ||||
|  | ||||
| (defn decorate [todo route editing i] | ||||
|   (let [{done? :completed text :text} todo] | ||||
|     (-> todo (assoc :editing (= editing i) | ||||
|                     :visible (and (not (empty? text)) | ||||
|                                   (or (= "#/" route) | ||||
|                                       (and (= "#/active" route) (not done?)) | ||||
|                                       (and (= "#/completed" route) done?))))))) | ||||
|  | ||||
| ;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (def   state        (-> (cell []) (local-storage ::store))) | ||||
|  | ||||
| ;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc  loaded?      false) | ||||
| (defc  editing      nil) | ||||
| (def   route        (route-cell "#/")) | ||||
|  | ||||
| ;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defc= completed    (filter :completed state)) | ||||
| (defc= active       (remove :completed state)) | ||||
| (defc= plural-item  (pluralize "item" (count active))) | ||||
| (defc= todos        (mapvi #(list %1 (decorate %2 route editing %1)) state)) | ||||
|  | ||||
| ;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (defn  todo        [t]   {:completed false :text t}) | ||||
| (defn  destroy!    [i]   (swap! state dissocv i)) | ||||
| (defn  done!       [i v] (swap! state assoc-in [i :completed] v)) | ||||
| (defn  clear-done! [& _] (swap! state #(vec (remove :completed %)))) | ||||
| (defn  new!        [t]   (when (not (empty? t)) (swap! state conj (todo t)))) | ||||
| (defn  all-done!   [v]   (swap! state #(mapv (fn [x] (assoc x :completed v)) %))) | ||||
| (defn  editing!    [i v] (reset! editing (if v i nil))) | ||||
| (defn  text!       [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v))) | ||||
|  | ||||
| ;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||||
|  | ||||
| (html :lang "en" | ||||
|   (head | ||||
|     (meta :charset "utf-8") | ||||
|     (meta :http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1") | ||||
|     (link :rel "stylesheet" :href "base.css") | ||||
|     (title "Hoplon • TodoMVC")) | ||||
|   (body | ||||
|     (noscript | ||||
|       (div :id "noscript" | ||||
|         (p "JavaScript is required to view this page."))) | ||||
|     (div | ||||
|       (section :id "todoapp" | ||||
|         (header :id "header" | ||||
|           (h1 "todos") | ||||
|           (form :on-submit #(do (new! (val-id :new-todo)) | ||||
|                                 (do! (by-id :new-todo) :value "")) | ||||
|             (input | ||||
|               :id "new-todo" | ||||
|               :type "text" | ||||
|               :autofocus true | ||||
|               :placeholder "What needs to be done?" | ||||
|               :on-blur #(do! (by-id :new-todo) :value "")))) | ||||
|         (section | ||||
|           :id "main" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (input | ||||
|             :id "toggle-all" | ||||
|             :type "checkbox" | ||||
|             :do-attr (cell= {:checked (empty? active)})  | ||||
|             :on-click #(all-done! (val-id :toggle-all))) | ||||
|           (label :for "toggle-all" | ||||
|             "Mark all as complete") | ||||
|           (ul :id "todo-list" | ||||
|             (loop-tpl | ||||
|               :reverse true | ||||
|               :bind-ids [done# edit#] | ||||
|               :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos]  | ||||
|               (li | ||||
|                 :do-class (cell= {:completed done? :editing edit?})  | ||||
|                 :do-toggle show? | ||||
|                 (div :class "view" :on-dblclick #(editing! @i true) | ||||
|                   (input | ||||
|                     :id done#  | ||||
|                     :type "checkbox" | ||||
|                     :class "toggle" | ||||
|                     :do-attr (cell= {:checked done?})  | ||||
|                     :on-click #(done! @i (val-id done#))) | ||||
|                   (label (text "~{todo-text}")) | ||||
|                   (button | ||||
|                     :type "submit" | ||||
|                     :class "destroy" | ||||
|                     :on-click  #(destroy! @i))) | ||||
|                 (form :on-submit #(editing! @i false) | ||||
|                   (input | ||||
|                     :id edit# | ||||
|                     :type "text" | ||||
|                     :class "edit" | ||||
|                     :do-value todo-text | ||||
|                     :do-focus edit? | ||||
|                     :on-blur #(when @edit? (editing! @i false)) | ||||
|                     :on-change #(when @edit? (text! @i (val-id edit#))))))))) | ||||
|         (footer  | ||||
|           :id "footer" | ||||
|           :do-toggle (cell= (not (and (empty? active) (empty? completed)))) | ||||
|           (span :id "todo-count" | ||||
|             (strong (text "~(count active) ")) | ||||
|             (span (text "~{plural-item} left"))) | ||||
|           (ul :id "filters" | ||||
|             (li (a :href "#/"          :do-class (cell= {:selected (= "#/" route)})          "All")) | ||||
|             (li (a :href "#/active"    :do-class (cell= {:selected (= "#/active" route)})    "Active")) | ||||
|             (li (a :href "#/completed" :do-class (cell= {:selected (= "#/completed" route)}) "Completed"))) | ||||
|           (button | ||||
|             :type      "submit" | ||||
|             :id        "clear-completed" | ||||
|             :on-click  #(clear-done!) | ||||
|             (text "Clear completed (~(count completed))")))) | ||||
|       (footer :id "info"  | ||||
|         (p "Double-click to edit a todo") | ||||
|         (p "Part of " (a :href "http://github.com/tailrecursion/hoplon-demos/" "hoplon-demos"))))))  | ||||
							
								
								
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										239
									
								
								samples/ColdFusion CFC/exampleScript.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,239 @@ | ||||
| /** | ||||
| ******************************************************************************** | ||||
| ContentBox - A Modular Content Platform | ||||
| Copyright 2012 by Luis Majano and Ortus Solutions, Corp | ||||
| www.gocontentbox.org | www.luismajano.com | www.ortussolutions.com | ||||
| ******************************************************************************** | ||||
| Apache License, Version 2.0 | ||||
|  | ||||
| Copyright Since [2012] [Luis Majano and Ortus Solutions,Corp] | ||||
|  | ||||
| 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. | ||||
| ******************************************************************************** | ||||
| * A generic content service for content objects | ||||
| */ | ||||
| component extends="coldbox.system.orm.hibernate.VirtualEntityService" singleton{ | ||||
|  | ||||
| 	// DI | ||||
| 	property name="settingService"			inject="id:settingService@cb"; | ||||
| 	property name="cacheBox"				inject="cachebox"; | ||||
| 	property name="log"						inject="logbox:logger:{this}"; | ||||
| 	property name="customFieldService" 	 	inject="customFieldService@cb"; | ||||
| 	property name="categoryService" 	 	inject="categoryService@cb"; | ||||
| 	property name="commentService" 	 		inject="commentService@cb"; | ||||
| 	property name="contentVersionService"	inject="contentVersionService@cb"; | ||||
| 	property name="authorService"			inject="authorService@cb"; | ||||
| 	property name="populator"				inject="wirebox:populator"; | ||||
| 	property name="systemUtil"				inject="SystemUtil@cb"; | ||||
| 	 | ||||
| 	/* | ||||
| 	* Constructor | ||||
| 	* @entityName.hint The content entity name to bind this service to. | ||||
| 	*/ | ||||
| 	ContentService function init(entityName="cbContent"){ | ||||
| 		// init it | ||||
| 		super.init(entityName=arguments.entityName, useQueryCaching=true); | ||||
|  | ||||
| 		// Test scope coloring in pygments | ||||
| 		this.colorTestVar = "Just for testing pygments!"; | ||||
| 		cookie.colorTestVar = ""; | ||||
| 		client.colorTestVar = "" | ||||
| 		session.colorTestVar = ""; | ||||
| 		application.colorTestVar = ""; | ||||
|  | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all content caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearAllPageWrapperCaches(boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear all page wrapper caches | ||||
| 	* @slug.hint The slug partial to clean on | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapperCaches(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper-#arguments.slug#",async=arguments.async); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Clear a page wrapper cache | ||||
| 	* @slug.hint The slug to clean | ||||
| 	* @async.hint Run it asynchronously or not, defaults to false | ||||
| 	*/ | ||||
| 	function clearPageWrapper(required any slug, boolean async=false){ | ||||
| 		var settings = settingService.getAllSettings(asStruct=true); | ||||
| 		// Get appropriate cache provider | ||||
| 		var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 		cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 		return this; | ||||
| 	} | ||||
|  | ||||
| 	/** | ||||
| 	* Searches published content with cool paramters, remember published content only | ||||
| 	* @searchTerm.hint The search term to search | ||||
| 	* @max.hint The maximum number of records to paginate | ||||
| 	* @offset.hint The offset in the pagination | ||||
| 	* @asQuery.hint Return as query or array of objects, defaults to array of objects | ||||
| 	* @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC | ||||
| 	* @isPublished.hint Search for published, non-published or both content objects [true, false, 'all'] | ||||
| 	* @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both. | ||||
| 	*/ | ||||
| 	function searchContent( | ||||
| 		any searchTerm="",  | ||||
| 		numeric max=0,  | ||||
| 		numeric offset=0,  | ||||
| 		boolean asQuery=false,  | ||||
| 		any sortOrder="publishedDate DESC",  | ||||
| 		any isPublished=true,  | ||||
| 		boolean searchActiveContent=true){ | ||||
|  | ||||
| 		var results = {}; | ||||
| 		var c = newCriteria(); | ||||
|  | ||||
| 		// only published content | ||||
| 		if( isBoolean( arguments.isPublished ) ){ | ||||
| 			// Published bit | ||||
| 			c.isEq( "isPublished", javaCast( "Boolean", arguments.isPublished ) ); | ||||
| 			// Published eq true evaluate other params | ||||
| 			if( arguments.isPublished ){ | ||||
| 				c.isLt("publishedDate", now() ) | ||||
| 				.$or( c.restrictions.isNull("expireDate"), c.restrictions.isGT("expireDate", now() ) ) | ||||
| 				.isEq("passwordProtection",""); | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// Search Criteria | ||||
| 		if( len( arguments.searchTerm ) ){ | ||||
| 			// like disjunctions | ||||
| 			c.createAlias("activeContent","ac"); | ||||
| 			// Do we search title and active content or just title? | ||||
| 			if( arguments.searchActiveContent ){ | ||||
| 				c.$or( c.restrictions.like("title","%#arguments.searchTerm#%"), | ||||
| 				  	  c.restrictions.like("ac.content", "%#arguments.searchTerm#%") ); | ||||
| 			} | ||||
| 			else{ | ||||
| 				c.like( "title", "%#arguments.searchTerm#%" );  | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
| 		// run criteria query and projections count | ||||
| 		results.count = c.count( "contentID" ); | ||||
| 		results.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY ) | ||||
| 							.list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery); | ||||
| 	 | ||||
| 		return results; | ||||
| 	} | ||||
|  | ||||
| /********************************************* PRIVATE *********************************************/ | ||||
| 	 | ||||
|  | ||||
| 	/** | ||||
| 	* Update the content hits | ||||
| 	* @contentID.hint The content id to update | ||||
| 	*/ | ||||
| 	private function syncUpdateHits(required contentID){ | ||||
| 		var q = new Query(sql="UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#").execute(); | ||||
| 		return this; | ||||
| 	} | ||||
| 	 | ||||
| 	 | ||||
| 	private function closureTest(){ | ||||
| 		methodCall( | ||||
| 			param1, | ||||
| 			function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			param1 | ||||
| 		); | ||||
| 	} | ||||
| 	 | ||||
| 	private function StructliteralTest(){ | ||||
| 		return { | ||||
| 			foo = bar, | ||||
| 			brad = 'Wood', | ||||
| 			func = function( arg1, required arg2 ){ | ||||
| 				var settings = settingService.getAllSettings(asStruct=true); | ||||
| 				// Get appropriate cache provider | ||||
| 				var cache = cacheBox.getCache( settings.cb_content_cacheName ); | ||||
| 				cache.clear("cb-content-pagewrapper-#arguments.slug#/"); | ||||
| 				return this; | ||||
| 			}, | ||||
| 			array = [ | ||||
| 				1, | ||||
| 				2, | ||||
| 				3, | ||||
| 				4, | ||||
| 				5, | ||||
| 				'test', | ||||
| 				'testing', | ||||
| 				'testerton', | ||||
| 				{ | ||||
| 					foo = true, | ||||
| 					brad = false, | ||||
| 					wood = null | ||||
| 				} | ||||
| 			], | ||||
| 			last = "final" | ||||
| 		}; | ||||
| 	} | ||||
| 	 | ||||
| 	private function arrayliteralTest(){ | ||||
| 		return [ | ||||
| 			1, | ||||
| 			2, | ||||
| 			3, | ||||
| 			4, | ||||
| 			5, | ||||
| 			'test', | ||||
| 			'testing', | ||||
| 			'testerton', | ||||
| 			{ | ||||
| 				foo = true, | ||||
| 				brad = false, | ||||
| 				wood = null | ||||
| 			}, | ||||
| 			'testy-von-testavich' | ||||
| 		]; | ||||
| 	} | ||||
| 	 | ||||
| } | ||||
							
								
								
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								samples/ColdFusion CFC/exampleTag.cfc
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| <cfcomponent> | ||||
| 	 | ||||
| 	<cffunction name="init" access="public" returntype="any"> | ||||
| 		<cfargument name="arg1" type="any" required="true"> | ||||
| 		<cfset this.myVariable = arguments.arg1> | ||||
|  | ||||
| 		<cfreturn this> | ||||
| 	</cffunction> | ||||
|  | ||||
| 	<cffunction name="testFunc" access="private" returntype="void"> | ||||
| 		<cfargument name="arg1" type="any" required="false"> | ||||
| 		 | ||||
| 		<cfif structKeyExists(arguments, "arg1")> | ||||
| 			<cfset writeoutput("Argument exists")> | ||||
| 		</cfif> | ||||
| 	</cffunction> | ||||
| 	 | ||||
| </cfcomponent> | ||||
							
								
								
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								samples/ColdFusion/example.cfm
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| <!--- cfcomment ---> | ||||
| <!--- nested <!--- cfcomment ---> ---> | ||||
| <!--- multi-line | ||||
| nested | ||||
| <!--- | ||||
| cfcomment | ||||
| ---> | ||||
| ---> | ||||
| <!-- html comment --> | ||||
| <html> | ||||
| <head> | ||||
| <title>Date Functions</title> | ||||
| </head> | ||||
| <body> | ||||
| <cfset RightNow = Now()> | ||||
| <cfoutput> | ||||
|  #RightNow#<br /> | ||||
|  #DateFormat(RightNow)#<br /> | ||||
|  #DateFormat(RightNow,"mm/dd/yy")#<br /> | ||||
|  #TimeFormat(RightNow)#<br /> | ||||
|  #TimeFormat(RightNow,"hh:mm tt")#<br /> | ||||
|  #IsDate(RightNow)#<br /> | ||||
|  #IsDate("January 31, 2007")#<br /> | ||||
|  #IsDate("foo")#<br /> | ||||
|  #DaysInMonth(RightNow)# | ||||
| </cfoutput> | ||||
| <cfset x="x"> | ||||
| <cfset y="y"> | ||||
| <cfset z="z"> | ||||
| <cfoutput group="x"> | ||||
|     #x# | ||||
|     <cfoutput>#y#</cfoutput> | ||||
|     #z# | ||||
| </cfoutput> | ||||
| </body> | ||||
| </html> | ||||
|  | ||||
| <cfset person = "Paul"> | ||||
| <cfset greeting = "Hello #person#"> | ||||
|  | ||||
| <cfset greeting = "Hello" & " world!"> | ||||
| <cfset a = 5> | ||||
| <cfset b = 10> | ||||
| <cfset c = a^b> | ||||
| <cfset c = a MOD b> | ||||
| <cfset c = a / b> | ||||
| <cfset c = a * b> | ||||
| <cfset c = a + b> | ||||
| <cfset c = a - b> | ||||
| <!--- <!-- another <!--- nested --> ---> comment ---> | ||||
							
								
								
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										580
									
								
								samples/Cycript/utils.cy
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,580 @@ | ||||
| (function(utils) { | ||||
| 	// Load C functions declared in utils.loadFuncs | ||||
| 	var shouldLoadCFuncs = true; | ||||
| 	// Expose the C functions to cycript's global scope | ||||
| 	var shouldExposeCFuncs = true; | ||||
| 	// Expose C constants to cycript's global scope | ||||
| 	var shouldExposeConsts = true; | ||||
| 	// Expose functions defined here to cycript's global scope | ||||
| 	var shouldExposeFuncs = true; | ||||
| 	// Which functions to expose | ||||
| 	var funcsToExpose = ["exec", "include", "sizeof", "logify", "apply", "str2voidPtr", "voidPtr2str", "double2voidPtr", "voidPtr2double", "isMemoryReadable", "isObject", "makeStruct"]; | ||||
| 	 | ||||
| 	// C functions that utils.loadFuncs loads | ||||
| 	var CFuncsDeclarations = [ | ||||
| 		// <stdlib.h> | ||||
| 		"void *calloc(size_t num, size_t size)", | ||||
| 		// <string.h> | ||||
| 		"char *strcpy(char *restrict dst, const char *restrict src)", | ||||
| 		"char *strdup(const char *s1)", | ||||
| 		"void* memset(void* dest, int ch, size_t count)", | ||||
| 		// <stdio.h> | ||||
| 		"FILE *fopen(const char *, const char *)", | ||||
| 		"int fclose(FILE *)", | ||||
| 		"size_t fread(void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		"size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)", | ||||
| 		// <mach.h> | ||||
| 		"mach_port_t mach_task_self()", | ||||
| 		"kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)", | ||||
| 		"kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)", | ||||
| 		"kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)", | ||||
| 		"kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)", | ||||
| 	]; | ||||
| 	 | ||||
| 	/* | ||||
| 		Replacement for eval that can handle @encode etc. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.exec("@encode(void *(int, char))") | ||||
| 			@encode(void*(int,char)) | ||||
| 	*/ | ||||
| 	utils.exec = function(str) { | ||||
| 		var mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, "mkdir")); | ||||
| 		var tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, "tempnam")); | ||||
| 		var fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, "fopen")); | ||||
| 		var fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, "fclose")); | ||||
| 		var fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, "fwrite")); | ||||
| 		var symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, "symlink")); | ||||
| 		var unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, "unlink")); | ||||
| 		var getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, "getenv")); | ||||
| 		var setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, "setenv")); | ||||
| 		 | ||||
| 		var libdir = "/usr/lib/cycript0.9"; | ||||
| 		var dir = libdir + "/tmp"; | ||||
|  | ||||
| 		mkdir(dir, 0777); | ||||
| 		 | ||||
| 		// This is needed because tempnam seems to ignore the first argument on i386 | ||||
| 		var old_tmpdir = getenv("TMPDIR"); | ||||
| 		setenv("TMPDIR", dir, 1); | ||||
|  | ||||
| 		// No freeing :( | ||||
| 		var f = tempnam(dir, "exec-"); | ||||
| 		setenv("TMPDIR", old_tmpdir, 1); | ||||
| 		if(!f) { | ||||
| 			return false; | ||||
| 		} | ||||
|  | ||||
| 		symlink(f, f + ".cy"); | ||||
| 		 | ||||
| 		str = "exports.result = " + str; | ||||
|  | ||||
| 		var handle = fopen(f, "w"); | ||||
| 		fwrite(str, str.length, 1, handle); | ||||
| 		fclose(handle); | ||||
| 		 | ||||
| 		var r; | ||||
| 		var except = null; | ||||
| 		try { | ||||
| 			r = require(f.replace(libdir + "/", "")); | ||||
| 		} catch(e) { | ||||
| 			except = e; | ||||
| 		} | ||||
|  | ||||
| 		unlink(f + ".cy"); | ||||
| 		unlink(f); | ||||
| 		 | ||||
| 		if(except !== null) { | ||||
| 			throw except; | ||||
| 		} | ||||
|  | ||||
| 		return r.result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Applies known typedefs | ||||
| 		Used in utils.include and utils.makeStruct | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.applyTypedefs("mach_vm_address_t") | ||||
| 			"uint64_t" | ||||
| 	*/ | ||||
| 	utils.applyTypedefs = function(str) { | ||||
| 		var typedefs = { | ||||
| 			"struct": "", | ||||
| 			"restrict": "", | ||||
| 			"FILE": "void", | ||||
| 			"size_t": "uint64_t", | ||||
| 			"uintptr_t": "unsigned long", | ||||
| 			"kern_return_t": "int", | ||||
| 			"mach_port_t": "unsigned int", | ||||
| 			"mach_port_name_t": "unsigned int", | ||||
| 			"vm_offset_t": "unsigned long", | ||||
| 			"vm_size_t": "unsigned long", | ||||
| 			"mach_vm_address_t": "uint64_t", | ||||
| 			"mach_vm_offset_t": "uint64_t", | ||||
| 			"mach_vm_size_t": "uint64_t", | ||||
| 			"vm_map_offset_t": "uint64_t", | ||||
| 			"vm_map_address_t": "uint64_t", | ||||
| 			"vm_map_size_t": "uint64_t", | ||||
| 			"mach_port_context_t": "uint64_t", | ||||
| 			"vm_map_t": "unsigned int", | ||||
| 			"boolean_t": "unsigned int", | ||||
| 			"vm_prot_t": "int", | ||||
| 			"mach_msg_type_number_t": "unsigned int", | ||||
| 			"cpu_type_t": "int", | ||||
| 			"cpu_subtype_t": "int", | ||||
| 			"cpu_threadtype_t": "int", | ||||
| 		}; | ||||
| 		 | ||||
| 		for(var k in typedefs) { | ||||
| 			str = str.replace(new RegExp("(\\s|\\*|,|\\(|^)" + k + "(\\s|\\*|,|\\)|$)", "g"), "$1" + typedefs[k] + "$2"); | ||||
| 		} | ||||
| 		 | ||||
| 		return str; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Parses a C function declaration and returns the function name and cycript type | ||||
| 		If load is true, tries to load it into cycript using utils.exec | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var str = "void *calloc(size_t num, size_t size)"; | ||||
| 			"void *calloc(size_t num, size_t size)" | ||||
| 			cy# utils.include(str) | ||||
| 			["calloc","@encode(void *(uint64_t num,  uint64_t size))(140735674376857)"] | ||||
| 			cy# var ret = utils.include(str, true) | ||||
| 			["calloc",0x7fff93e0e299] | ||||
| 			cy# ret[1].type | ||||
| 			@encode(void*(unsigned long long int,unsigned long long int)) | ||||
| 			cy# ret[1](100, 1) | ||||
| 			0x100444100 | ||||
| 	*/ | ||||
| 	utils.include = function(str, load) { | ||||
| 		var re = /^\s*([^(]*(?:\s+|\*))(\w*)\s*\(([^)]*)\)\s*;?\s*$/; | ||||
| 		var match = re.exec(str); | ||||
| 		if(!match) { | ||||
| 			return -1; | ||||
| 		} | ||||
| 		var rType = utils.applyTypedefs(match[1]); | ||||
| 		var name = match[2]; | ||||
| 		var args = match[3]; | ||||
|  | ||||
| 		var argsRe = /([^,]+)(?:,|$)/g; | ||||
| 		var argsTypes = []; | ||||
| 		while((match = argsRe.exec(args)) !== null) { | ||||
| 			var type = utils.applyTypedefs(match[1]); | ||||
| 			argsTypes.push(type); | ||||
| 		} | ||||
| 		 | ||||
| 		var encodeString = "@encode("; | ||||
| 		encodeString += rType + "("; | ||||
| 		encodeString += argsTypes.join(", ") + "))"; | ||||
|  | ||||
| 		var fun = dlsym(RTLD_DEFAULT, name); | ||||
| 		if(fun !== null) { | ||||
| 			encodeString += "(" + fun + ")"; | ||||
| 			if(load) { | ||||
| 				return [name, utils.exec(encodeString)]; | ||||
| 			} | ||||
| 		} else if(load) { | ||||
| 			throw "Function couldn't be found with dlsym!"; | ||||
| 		} | ||||
|  | ||||
| 		return [name, encodeString]; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Loads the function declaration in the defs array using utils.exec and exposes to cycript's global scope | ||||
| 		Is automatically called if shouldLoadCFuncs is true | ||||
| 	*/ | ||||
| 	utils.funcs = {}; | ||||
| 	utils.loadfuncs = function(expose) { | ||||
| 		for(var i = 0; i < CFuncsDeclarations.length; i++) { | ||||
| 			try { | ||||
| 				var o = utils.include(CFuncsDeclarations[i], true); | ||||
| 				utils.funcs[o[0]] = o[1]; | ||||
| 				if(expose) { | ||||
| 					Cycript.all[o[0]] = o[1]; | ||||
| 				} | ||||
| 			} catch(e) { | ||||
| 				system.print("Failed to load function: " + i); | ||||
| 				try { | ||||
| 					system.print(utils.include(CFuncsDeclarations[i])); | ||||
| 				} catch(e2) { | ||||
| 					 | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calculates the size of a type like the C operator sizeof | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.sizeof(int) | ||||
| 			4 | ||||
| 			cy# utils.sizeof(@encode(void *)) | ||||
| 			8 | ||||
| 			cy# utils.sizeof("mach_vm_address_t") | ||||
| 			8 | ||||
| 	*/ | ||||
| 	utils.sizeof = function(type) { | ||||
| 		if(typeof type === "string") { | ||||
| 			type = utils.applyTypedefs(type); | ||||
| 			type = utils.exec("@encode(" + type + ")"); | ||||
| 		} | ||||
| 		 | ||||
| 		// (const) char * has "infinite" preceision | ||||
| 		if(type.toString().slice(-1) === "*") { | ||||
| 			return utils.sizeof(@encode(void *)); | ||||
| 		} | ||||
| 		 | ||||
| 		// float and double | ||||
| 		if(type.toString() === @encode(float).toString()) { | ||||
| 			return 4; | ||||
| 		} else if (type.toString() === @encode(double).toString()) { | ||||
| 			return 8; | ||||
| 		} | ||||
|  | ||||
| 		var typeInstance = type(0); | ||||
| 		 | ||||
| 		if(typeInstance instanceof Object) { | ||||
| 			// Arrays | ||||
| 			if("length" in typeInstance) { | ||||
| 				return typeInstance.length * utils.sizeof(typeInstance.type); | ||||
| 			} | ||||
| 			 | ||||
| 			// Structs | ||||
| 			if(typeInstance.toString() === "[object Struct]") { | ||||
| 				var typeStr = type.toString(); | ||||
| 				var arrayTypeStr = "[2" + typeStr + "]"; | ||||
| 				var arrayType = new Type(arrayTypeStr); | ||||
| 				 | ||||
| 				var arrayInstance = new arrayType; | ||||
| 				 | ||||
| 				return @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0])); | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		for(var i = 0; i < 5; i++) { | ||||
| 			var maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1; | ||||
| 			if(i === 3) { | ||||
| 				// Floating point fix ;^) | ||||
| 				maxSigned /= 1000; | ||||
| 			} | ||||
|  | ||||
| 			// can't use !== or sizeof(void *) === 0.5 | ||||
| 			if(type(maxSigned) != maxSigned) { | ||||
| 				return Math.pow(2, i - 1); | ||||
| 			} | ||||
| 		} | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Logs a specific message sent to an instance of a class like logify.pl in theos | ||||
| 		Requires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules | ||||
| 		Returns the old message returned by MS.hookMessage (Note: this is not just the old message!) | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:)) | ||||
| 			... | ||||
| 			cy# var n = [NSNumber numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.805 cycript[71213:507] +[<NSNumber: 0x10032d0c4> numberWithDouble:1.5] | ||||
| 			2014-07-28 02:26:39.806 cycript[71213:507]  = 1.5 | ||||
| 			@1.5 | ||||
| 	*/ | ||||
| 	utils.logify = function(cls, sel) { | ||||
| 		@import com.saurik.substrate.MS; | ||||
| 		@import org.cycript.NSLog; | ||||
| 		 | ||||
| 		var oldm = {}; | ||||
| 		 | ||||
| 		MS.hookMessage(cls, sel, function() { | ||||
| 			var args = [].slice.call(arguments); | ||||
| 			 | ||||
| 			var selFormat = sel.toString().replace(/:/g, ":%@ ").trim(); | ||||
| 			var logFormat = "%@[<%@: 0x%@> " + selFormat + "]"; | ||||
| 			 | ||||
| 			var standardArgs = [logFormat, class_isMetaClass(cls)? "+": "-", cls.toString(), (&this).valueOf().toString(16)]; | ||||
| 			var logArgs = standardArgs.concat(args); | ||||
| 			 | ||||
| 			NSLog.apply(null, logArgs); | ||||
| 			 | ||||
| 			var r = oldm->apply(this, arguments); | ||||
| 			 | ||||
| 			if(r !== undefined) { | ||||
| 				NSLog(" = %@", r); | ||||
| 			} | ||||
| 			 | ||||
| 			return r; | ||||
| 		}, oldm); | ||||
| 		 | ||||
| 		return oldm; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Calls a C function by providing its name and arguments | ||||
| 		Doesn't support structs | ||||
| 		Return value is always a void pointer | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.apply("printf", ["%s %.3s, %d -> %c, float: %f\n", "foo", "barrrr", 97, 97, 1.5]) | ||||
| 			foo bar, 97 -> a, float: 1.500000 | ||||
| 			0x22 | ||||
| 	*/ | ||||
| 	utils.apply = function(fun, args) { | ||||
| 		if(!(args instanceof Array)) { | ||||
| 			throw "Args needs to be an array!"; | ||||
| 		} | ||||
| 		 | ||||
| 		var argc = args.length; | ||||
| 		var voidPtr = @encode(void *); | ||||
| 		var argTypes = []; | ||||
| 		for(var i = 0; i < argc; i++) { | ||||
| 			var argType = voidPtr; | ||||
| 			 | ||||
| 			var arg = args[i]; | ||||
| 			if(typeof arg === "string") { | ||||
| 				argType = @encode(char *); | ||||
| 			} | ||||
| 			if(typeof arg === "number" && arg % 1 !== 0) { | ||||
| 				argType = @encode(double); | ||||
| 			} | ||||
| 			 | ||||
| 			argTypes.push(argType); | ||||
| 		} | ||||
| 		 | ||||
| 		var type = voidPtr.functionWith.apply(voidPtr, argTypes); | ||||
| 		 | ||||
| 		if(typeof fun === "string") { | ||||
| 			fun = dlsym(RTLD_DEFAULT, fun); | ||||
| 		} | ||||
| 		 | ||||
| 		if(!fun) { | ||||
| 			throw "Function not found!"; | ||||
| 		} | ||||
|  | ||||
| 		return type(fun).apply(null, args); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a string (char *) to a void pointer (void *) | ||||
| 		You can't cast to strings to void pointers and vice versa in cycript. Blame saurik. | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var voidPtr = utils.str2voidPtr("foobar") | ||||
| 			0x100331590 | ||||
| 			cy# utils.voidPtr2str(voidPtr) | ||||
| 			"foobar" | ||||
| 	*/ | ||||
| 	utils.str2voidPtr = function(str) { | ||||
| 		var strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(str); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of str2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2str = function(voidPtr) { | ||||
| 		var strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, "strdup")); | ||||
| 		return strdup(voidPtr); | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Converts a double into a void pointer | ||||
| 		This can be used to view the binary representation of a floating point number | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var n = utils.double2voidPtr(-1.5) | ||||
| 			0xbff8000000000000 | ||||
| 			cy# utils.voidPtr2double(n) | ||||
| 			-1.5 | ||||
| 	*/ | ||||
| 	utils.double2voidPtr = function(n) { | ||||
| 		var doublePtr = new double; | ||||
| 		*doublePtr = n; | ||||
| 		 | ||||
| 		var voidPtrPtr = @encode(void **)(doublePtr); | ||||
| 		 | ||||
| 		return *voidPtrPtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		The inverse function of double2voidPtr | ||||
| 	*/ | ||||
| 	utils.voidPtr2double = function(voidPtr) { | ||||
| 		var voidPtrPtr = new @encode(void **); | ||||
| 		*voidPtrPtr = voidPtr; | ||||
| 		 | ||||
| 		var doublePtr = @encode(double *)(voidPtrPtr); | ||||
| 		 | ||||
| 		return *doublePtr; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if a memory location is readable | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# utils.isMemoryReadable(0) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isMemoryReadable(NSObject) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isMemoryReadable(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isMemoryReadable = function(ptr) { | ||||
| 		if(typeof ptr === "string") { | ||||
| 			return true; | ||||
| 		} | ||||
| 		 | ||||
| 		var fds = new @encode(int [2]); | ||||
| 		utils.apply("pipe", [fds]); | ||||
| 		var result = utils.apply("write", [fds[1], ptr, 1]) == 1; | ||||
| 		 | ||||
| 		utils.apply("close", [fds[0]]); | ||||
| 		utils.apply("close", [fds[1]]); | ||||
| 		 | ||||
| 		return result; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Determines in a safe way if the memory location contains an Objective-C object | ||||
|  | ||||
| 		Usage: | ||||
| 			cy# utils.isObject(0) | ||||
| 			false | ||||
| 			cy# utils.isObject(0x1337) | ||||
| 			false | ||||
| 			cy# utils.isObject(NSObject) | ||||
| 			true | ||||
| 			cy# utils.isObject(objc_getMetaClass(NSObject)) | ||||
| 			true | ||||
| 			cy# utils.isObject([new NSObject init]) | ||||
| 			true | ||||
| 			cy# var a = malloc(100); utils.isObject(a) | ||||
| 			false | ||||
| 			cy# *@encode(void **)(a) = NSObject; utils.isObject(a) | ||||
| 			true | ||||
| 	*/ | ||||
| 	utils.isObject = function(obj) { | ||||
| 		obj = @encode(void *)(obj); | ||||
| 		var lastObj = -1; | ||||
| 		 | ||||
| 		function objc_isa_ptr(obj) { | ||||
| 			// See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html | ||||
| 			var objc_debug_isa_class_mask = 0x00000001fffffffa; | ||||
| 			obj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj; | ||||
| 			 | ||||
| 			if((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) { | ||||
| 				return null; | ||||
| 			} else { | ||||
| 				return obj; | ||||
| 			} | ||||
| 		} | ||||
| 		 | ||||
| 		function ptrValue(obj) { | ||||
| 			return obj? obj.valueOf(): null; | ||||
| 		} | ||||
| 		 | ||||
| 		var foundMetaClass = false; | ||||
| 		 | ||||
| 		for(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) { | ||||
| 			obj = *@encode(void **)(obj); | ||||
| 			 | ||||
| 			if(ptrValue(obj) == ptrValue(lastObj)) { | ||||
| 				foundMetaClass = true; | ||||
| 				break; | ||||
| 			} | ||||
| 			 | ||||
| 			lastObj = obj; | ||||
| 		} | ||||
| 		 | ||||
| 		if(!foundMetaClass) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		if(lastObj === -1 || lastObj === null) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var obj_class = objc_isa_ptr(@encode(void **)(obj)[1]); | ||||
| 		 | ||||
| 		if(!utils.isMemoryReadable(obj_class)) { | ||||
| 			return false; | ||||
| 		} | ||||
| 		 | ||||
| 		var metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]); | ||||
| 		var superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]); | ||||
| 		 | ||||
| 		return ptrValue(obj) == ptrValue(metaclass) && superclass == null; | ||||
| 	}; | ||||
| 	 | ||||
| 	/* | ||||
| 		Creates a cycript struct type from a C struct definition | ||||
| 		 | ||||
| 		Usage: | ||||
| 			cy# var foo = makeStruct("int a; short b; char c; uint64_t d; double e;", "foo"); | ||||
| 			@encode(foo) | ||||
| 			cy# var f = new foo | ||||
| 			&{a:0,b:0,c:0,d:0,e:0} | ||||
| 			cy# f->a = 100; f | ||||
| 			&{a:100,b:0,c:0,d:0,e:0} | ||||
| 			cy# *@encode(int *)(f) | ||||
| 			100 | ||||
| 	*/ | ||||
| 	utils.makeStruct = function(str, name) {		 | ||||
| 		var fieldRe = /(?:\s|\n)*([^;]+\s*(?:\s|\*))([^;]+)\s*;/g; | ||||
| 		 | ||||
| 		if(!name) { | ||||
| 			name = "struct" + Math.floor(Math.random() * 100000); | ||||
| 		} | ||||
| 		var typeStr = "{" + name + "="; | ||||
| 		 | ||||
| 		while((match = fieldRe.exec(str)) !== null) { | ||||
| 			var fieldType = utils.applyTypedefs(match[1]); | ||||
| 			var fieldName = match[2]; | ||||
| 			var encodedType = utils.exec("@encode(" + fieldType + ")").toString(); | ||||
| 			 | ||||
| 			typeStr += '"' + fieldName + '"' + encodedType; | ||||
| 		} | ||||
| 		 | ||||
| 		typeStr += "}"; | ||||
| 		 | ||||
| 		return new Type(typeStr); | ||||
| 	}; | ||||
| 	 | ||||
| 	// Various constants | ||||
| 	utils.constants = { | ||||
| 		VM_PROT_NONE:       0x0, | ||||
| 		VM_PROT_READ:       0x1, | ||||
| 		VM_PROT_WRITE:      0x2, | ||||
| 		VM_PROT_EXECUTE:    0x4, | ||||
| 		VM_PROT_NO_CHANGE:  0x8, | ||||
| 		VM_PROT_COPY:       0x10, | ||||
| 		VM_PROT_WANTS_COPY: 0x10, | ||||
| 		VM_PROT_IS_MASK:    0x40, | ||||
| 	}; | ||||
| 	var c = utils.constants; | ||||
| 	c.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE; | ||||
| 	c.VM_PROT_ALL =     c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE; | ||||
| 	 | ||||
| 	if(shouldExposeConsts) { | ||||
| 		for(var k in c) { | ||||
| 			Cycript.all[k] = c[k]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldExposeFuncs) { | ||||
| 		for(var i = 0; i < funcsToExpose.length; i++) { | ||||
| 			var name = funcsToExpose[i]; | ||||
| 			Cycript.all[name] = utils[name]; | ||||
| 		} | ||||
| 	} | ||||
| 	 | ||||
| 	if(shouldLoadCFuncs) { | ||||
| 		utils.loadfuncs(shouldExposeCFuncs); | ||||
| 	} | ||||
| })(exports); | ||||
							
								
								
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										23
									
								
								samples/EmberScript/momentComponent.em
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,23 @@ | ||||
| class App.FromNowView extends Ember.View | ||||
|     tagName: 'time' | ||||
|     template: Ember.Handlebars.compile '{{view.output}}' | ||||
|     output: ~> | ||||
|         return moment(@value).fromNow() | ||||
|  | ||||
|     didInsertElement: -> | ||||
|         @tick() | ||||
|  | ||||
|     tick: -> | ||||
|         f = -> | ||||
|             @notifyPropertyChange 'output' | ||||
|             @tick() | ||||
|  | ||||
|         nextTick = Ember.run.later(this, f, 1000) | ||||
|         @set 'nextTick', nextTick | ||||
|  | ||||
|     willDestroyElement: -> | ||||
|         nextTick = @nextTick | ||||
|         Ember.run.cancel nextTick | ||||
|  | ||||
| Ember.Handlebars.helper 'fromNow', App.FromNowView | ||||
|  | ||||
							
								
								
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/bitmap.frt
									
									
									
									
									
										Normal 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 ; | ||||
							
								
								
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								samples/Forth/enum.frt
									
									
									
									
									
										Normal 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
									
								
							
							
						
						
									
										8
									
								
								samples/Forth/macros.frt
									
									
									
									
									
										Normal 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 . ; ) | ||||
							
								
								
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/G-code/duettest.g
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| ; RepRapPro Ormerod | ||||
| ; Board test GCodes | ||||
| M111 S1; Debug on | ||||
| G21 ; mm | ||||
| G90 ; Absolute positioning | ||||
| M83 ; Extrusion relative | ||||
| M906 X800 Y800 Z800 E800 ; Motor currents (mA) | ||||
| T0 ; Extruder 0 | ||||
| G1 X50 F500 | ||||
| G1 X0 | ||||
| G4 P500 | ||||
| G1 Y50 F500 | ||||
| G1 Y0 | ||||
| G4 P500 | ||||
| G1 Z20 F200 | ||||
| G1 Z0 | ||||
| G4 P500 | ||||
| G1 E20 F200 | ||||
| G1 E-20 | ||||
| G4 P500 | ||||
| M106 S255 | ||||
| G4 P500 | ||||
| M106 S0 | ||||
| G4 P500 | ||||
| M105 | ||||
| G10 P0 S100 | ||||
| T0 | ||||
| M140 S100 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| G4 P5000 | ||||
| M105 | ||||
| M0 | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25912
									
								
								samples/G-code/lm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29735
									
								
								samples/G-code/rm.g
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/G-code/square.g
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| G28 X0 Y0 | ||||
| G1 X55 Y5 F2000 | ||||
| G1 Y180 | ||||
| G1 X180 | ||||
| G1 Y5 | ||||
| G1 X55 | ||||
| G1 Y180 | ||||
| G1 X180 | ||||
| G1 Y5 | ||||
| G1 X55 | ||||
| M0 | ||||
|  | ||||
|  | ||||
							
								
								
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								samples/GDScript/example.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,57 @@ | ||||
| # Taken from https://github.com/okamstudio/godot/wiki/gdscript | ||||
| # a file is a class! | ||||
|  | ||||
| # inheritance | ||||
|  | ||||
| extends BaseClass | ||||
|  | ||||
| # member variables | ||||
|  | ||||
| var a = 5  | ||||
| var s = "Hello" | ||||
| var arr = [1, 2, 3] | ||||
| var dict = {"key":"value", 2:3} | ||||
|  | ||||
| # constants | ||||
|  | ||||
| const answer = 42 | ||||
| const thename = "Charly" | ||||
|  | ||||
| # built-in vector types | ||||
|  | ||||
| var v2 = Vector2(1, 2) | ||||
| var v3 = Vector3(1, 2, 3) | ||||
|  | ||||
| # function | ||||
|  | ||||
| func some_function(param1, param2): | ||||
|     var local_var = 5 | ||||
|  | ||||
|     if param1 < local_var: | ||||
|         print(param1) | ||||
|     elif param2 > 5: | ||||
|         print(param2) | ||||
|     else: | ||||
|         print("fail!") | ||||
|  | ||||
|     for i in range(20): | ||||
|         print(i) | ||||
|  | ||||
|     while(param2 != 0): | ||||
|         param2 -= 1 | ||||
|  | ||||
|     var local_var2 = param1+3 | ||||
|     return local_var2 | ||||
|  | ||||
|  | ||||
| # subclass | ||||
|  | ||||
| class Something: | ||||
|     var a = 10 | ||||
|  | ||||
| # constructor | ||||
|  | ||||
| func _init(): | ||||
|     print("constructed!") | ||||
|     var lv = Something.new() | ||||
|     print(lv.a) | ||||
							
								
								
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										216
									
								
								samples/GDScript/grid.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,216 @@ | ||||
|  | ||||
|  | ||||
| extends Control | ||||
|  | ||||
| # Simple Tetris-like demo, (c) 2012 Juan Linietsky | ||||
| # Implemented by using a regular Control and drawing on it during the _draw() callback. | ||||
| # The drawing surface is updated only when changes happen (by calling update()) | ||||
|  | ||||
|  | ||||
| var score = 0 | ||||
| var score_label=null | ||||
|  | ||||
| const MAX_SHAPES = 7 | ||||
|  | ||||
| var block = preload("block.png") | ||||
|  | ||||
| var block_colors=[ | ||||
| 	Color(1,0.5,0.5), | ||||
| 	Color(0.5,1,0.5), | ||||
| 	Color(0.5,0.5,1), | ||||
| 	Color(0.8,0.4,0.8), | ||||
| 	Color(0.8,0.8,0.4), | ||||
| 	Color(0.4,0.8,0.8), | ||||
| 	Color(0.7,0.7,0.7)] | ||||
|  | ||||
| var	block_shapes=[ | ||||
| 	[ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I | ||||
| 	[ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O | ||||
| 	[ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S | ||||
| 	[ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z | ||||
| 	[ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L | ||||
| 	[ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J | ||||
| 	[ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T | ||||
| 	 | ||||
|  | ||||
| var block_rotations=[ | ||||
| 	Matrix32( Vector2(1,0),Vector2(0,1), Vector2() ), | ||||
| 	Matrix32( Vector2(0,1),Vector2(-1,0), Vector2() ), | ||||
| 	Matrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ), | ||||
| 	Matrix32( Vector2(0,-1),Vector2(1,0), Vector2() ) | ||||
| ] | ||||
| 	 | ||||
|  | ||||
| var width=0 | ||||
| var height=0 | ||||
|  | ||||
| var cells={} | ||||
|  | ||||
| var piece_active=false | ||||
| var piece_shape=0 | ||||
| var piece_pos=Vector2() | ||||
| var piece_rot=0 | ||||
|  | ||||
|  | ||||
| func piece_cell_xform(p,er=0): | ||||
| 	var r = (4+er+piece_rot)%4 | ||||
| 	return piece_pos+block_rotations[r].xform(p) | ||||
|  | ||||
| func _draw(): | ||||
|  | ||||
| 	var sb = get_stylebox("bg","Tree") # use line edit bg | ||||
| 	draw_style_box(sb,Rect2(Vector2(),get_size()).grow(3)) | ||||
| 	 | ||||
| 	var bs = block.get_size() | ||||
| 	for y in range(height): | ||||
| 		for x in range(width): | ||||
| 			if (Vector2(x,y) in cells): | ||||
| 				draw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]]) | ||||
| 				 | ||||
| 	if (piece_active): | ||||
| 		 | ||||
| 		for c in block_shapes[piece_shape]: | ||||
| 			draw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape]) | ||||
| 			 | ||||
|  | ||||
| func piece_check_fit(ofs,er=0): | ||||
|  | ||||
| 	for c in block_shapes[piece_shape]: | ||||
| 		var pos = piece_cell_xform(c,er)+ofs | ||||
| 		if (pos.x < 0): | ||||
| 			return false | ||||
| 		if (pos.y < 0): | ||||
| 			return false | ||||
| 		if (pos.x >= width): | ||||
| 			return false | ||||
| 		if (pos.y >= height): | ||||
| 			return false | ||||
| 		if (pos in cells): | ||||
| 			return false | ||||
| 	 | ||||
| 	return true	 | ||||
|  | ||||
| func new_piece(): | ||||
|  | ||||
| 	piece_shape = randi() % MAX_SHAPES	 | ||||
| 	piece_pos = Vector2(width/2,0) | ||||
| 	piece_active=true | ||||
| 	piece_rot=0 | ||||
| 	if (piece_shape==0): | ||||
| 		piece_pos.y+=1 | ||||
| 		 | ||||
| 	if (not piece_check_fit(Vector2())): | ||||
| 		#game over | ||||
| 		#print("GAME OVER!") | ||||
| 		game_over() | ||||
| 		 | ||||
| 	update() | ||||
| 		 | ||||
| 	 | ||||
| func test_collapse_rows(): | ||||
| 	var accum_down=0 | ||||
| 	for i in range(height): | ||||
| 		var y = height - i - 1 | ||||
| 		var collapse = true | ||||
| 		for x in range(width): | ||||
| 			if (Vector2(x,y) in cells): | ||||
| 				if (accum_down): | ||||
| 					cells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)] | ||||
| 			else: | ||||
| 				collapse=false | ||||
| 				if (accum_down): | ||||
| 					cells.erase( Vector2(x,y+accum_down) ) | ||||
| 						 | ||||
| 		if (collapse): | ||||
| 			accum_down+=1 | ||||
| 		 | ||||
| 			 | ||||
| 	score+=accum_down*100 | ||||
| 	score_label.set_text(str(score)) | ||||
| 			 | ||||
| 		 | ||||
| func game_over(): | ||||
|  | ||||
| 		piece_active=false | ||||
| 		get_node("gameover").set_text("Game Over")		 | ||||
| 		update() | ||||
| 				 | ||||
| 		 | ||||
| func restart_pressed(): | ||||
|  | ||||
| 		score=0 | ||||
| 		score_label.set_text("0") | ||||
| 		cells.clear() | ||||
| 		get_node("gameover").set_text("")		 | ||||
| 		piece_active=true | ||||
| 		update() | ||||
| 		 | ||||
| 		 | ||||
|  | ||||
| func piece_move_down(): | ||||
|  | ||||
| 	if (!piece_active): | ||||
| 		return | ||||
| 	if (piece_check_fit(Vector2(0,1))): | ||||
| 		piece_pos.y+=1 | ||||
| 		update()		 | ||||
| 	else: | ||||
|  | ||||
| 		for c in block_shapes[piece_shape]: | ||||
| 			var pos = piece_cell_xform(c) | ||||
| 			cells[pos]=piece_shape | ||||
| 		test_collapse_rows() | ||||
| 		new_piece() | ||||
| 		 | ||||
|  | ||||
| func piece_rotate(): | ||||
|  | ||||
| 	var adv = 1 | ||||
| 	if (not piece_check_fit(Vector2(),1)): | ||||
| 		return | ||||
| 	piece_rot = (piece_rot + adv) % 4 | ||||
| 	update() | ||||
| 	 | ||||
| 	 | ||||
|  | ||||
| func _input(ie): | ||||
|  | ||||
|  | ||||
| 	if (not piece_active): | ||||
| 		return | ||||
| 	if (!ie.is_pressed()): | ||||
| 		return | ||||
|  | ||||
| 	if (ie.is_action("move_left")): | ||||
| 		if (piece_check_fit(Vector2(-1,0))): | ||||
| 			piece_pos.x-=1 | ||||
| 			update() | ||||
| 	elif (ie.is_action("move_right")): | ||||
| 		if (piece_check_fit(Vector2(1,0))): | ||||
| 			piece_pos.x+=1 | ||||
| 			update() | ||||
| 	elif (ie.is_action("move_down")): | ||||
| 		piece_move_down() | ||||
| 	elif (ie.is_action("rotate")): | ||||
| 		piece_rotate() | ||||
| 		 | ||||
| 		 | ||||
| func setup(w,h): | ||||
| 	width=w | ||||
| 	height=h | ||||
| 	set_size( Vector2(w,h)*block.get_size() ) | ||||
| 	new_piece() | ||||
| 	get_node("timer").start() | ||||
| 	 | ||||
|  | ||||
| func _ready(): | ||||
| 	# Initalization here | ||||
|  | ||||
| 	setup(10,20) | ||||
| 	score_label = get_node("../score") | ||||
|  | ||||
| 	set_process_input(true) | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								samples/GDScript/player.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,243 @@ | ||||
|  | ||||
| extends RigidBody | ||||
|  | ||||
| # member variables here, example: | ||||
| # var a=2 | ||||
| # var b="textvar" | ||||
|  | ||||
| #var dir=Vector3() | ||||
|  | ||||
| const ANIM_FLOOR = 0 | ||||
| const ANIM_AIR_UP = 1 | ||||
| const ANIM_AIR_DOWN = 2 | ||||
|  | ||||
| const SHOOT_TIME = 1.5 | ||||
| const SHOOT_SCALE = 2 | ||||
|  | ||||
| const CHAR_SCALE = Vector3(0.3,0.3,0.3) | ||||
|  | ||||
| var facing_dir = Vector3(1, 0, 0) | ||||
| var movement_dir = Vector3() | ||||
|  | ||||
| var jumping=false | ||||
|  | ||||
| var turn_speed=40 | ||||
| var keep_jump_inertia = true | ||||
| var air_idle_deaccel = false | ||||
| var accel=19.0 | ||||
| var deaccel=14.0 | ||||
| var sharp_turn_threshhold = 140 | ||||
|  | ||||
| var max_speed=3.1 | ||||
| var on_floor = false | ||||
|  | ||||
| var prev_shoot = false | ||||
|  | ||||
| var last_floor_velocity = Vector3() | ||||
|  | ||||
| var shoot_blend = 0 | ||||
|  | ||||
| func adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn): | ||||
|  | ||||
| 	var n = p_target # normal | ||||
| 	var t = n.cross(current_gn).normalized() | ||||
| 	 | ||||
| 	var x = n.dot(p_facing) | ||||
| 	var y = t.dot(p_facing) | ||||
| 	 | ||||
| 	var ang = atan2(y,x) | ||||
| 	 | ||||
| 	if (abs(ang)<0.001): # too small | ||||
| 		return p_facing | ||||
| 	 | ||||
| 	var s = sign(ang) | ||||
| 	ang = ang * s | ||||
| 	var turn = ang * p_adjust_rate * p_step | ||||
| 	var a | ||||
| 	if (ang<turn): | ||||
| 		a=ang | ||||
| 	else: | ||||
| 		a=turn | ||||
| 	ang = (ang - a) * s | ||||
| 	 | ||||
| 	return ((n * cos(ang)) + (t * sin(ang))) * p_facing.length() | ||||
|  | ||||
|  | ||||
|  | ||||
| func _integrate_forces( state ): | ||||
|  | ||||
| 	var lv = state.get_linear_velocity() # linear velocity | ||||
| 	var g = state.get_total_gravity() | ||||
| 	var delta = state.get_step() | ||||
| 	var d = 1.0 - delta*state.get_total_density() | ||||
| 	if (d<0): | ||||
| 		d=0 | ||||
| 	lv += g * delta #apply gravity | ||||
|  | ||||
| 	var anim = ANIM_FLOOR | ||||
|  | ||||
| 	var up = -g.normalized() # (up is against gravity) | ||||
| 	var vv = up.dot(lv) # vertical velocity | ||||
| 	var hv = lv - (up*vv) # horizontal velocity | ||||
|  | ||||
|  | ||||
|  | ||||
| 	var hdir = hv.normalized() # horizontal direction | ||||
| 	var hspeed = hv.length()	#horizontal speed | ||||
|  | ||||
| 	var floor_velocity | ||||
| 	var onfloor = false | ||||
|  | ||||
| 	if (state.get_contact_count() == 0): | ||||
| 		floor_velocity = last_floor_velocity | ||||
| 	else: | ||||
| 		for i in range(state.get_contact_count()): | ||||
| 			if (state.get_contact_local_shape(i) != 1): | ||||
| 				continue | ||||
| 			 | ||||
| 			onfloor = true | ||||
| 			floor_velocity = state.get_contact_collider_velocity_at_pos(i) | ||||
| 			break | ||||
| 		 | ||||
|  | ||||
| 	var dir = Vector3() #where does the player intend to walk to | ||||
| 	var cam_xform = get_node("target/camera").get_global_transform() | ||||
| 	 | ||||
| 	if (Input.is_action_pressed("move_forward")): | ||||
| 		dir+=-cam_xform.basis[2]  | ||||
| 	if (Input.is_action_pressed("move_backwards")): | ||||
| 		dir+=cam_xform.basis[2]  | ||||
| 	if (Input.is_action_pressed("move_left")): | ||||
| 		dir+=-cam_xform.basis[0]  | ||||
| 	if (Input.is_action_pressed("move_right")): | ||||
| 		dir+=cam_xform.basis[0]  | ||||
| 		 | ||||
| 	var jump_attempt = Input.is_action_pressed("jump") | ||||
| 	var shoot_attempt = Input.is_action_pressed("shoot") | ||||
| 		 | ||||
| 	var target_dir = (dir - up*dir.dot(up)).normalized() | ||||
| 	 | ||||
| 	if (onfloor): | ||||
|  | ||||
| 		var sharp_turn = hspeed > 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold | ||||
|  | ||||
| 		if (dir.length()>0.1 and !sharp_turn) : | ||||
| 			if (hspeed > 0.001) : | ||||
|  | ||||
| 				#linear_dir = linear_h_velocity/linear_vel | ||||
| 				#if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit))) | ||||
| 				#	brake=true | ||||
| 				#else | ||||
| 				hdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up) | ||||
| 				facing_dir = hdir | ||||
| 			else: | ||||
|  | ||||
| 				hdir = target_dir | ||||
| 			 | ||||
| 			if (hspeed<max_speed): | ||||
| 				hspeed+=accel*delta | ||||
|  | ||||
| 		else: | ||||
| 			hspeed-=deaccel*delta | ||||
| 			if (hspeed<0): | ||||
| 				hspeed=0 | ||||
| 		 | ||||
| 		hv = hdir*hspeed | ||||
| 		 | ||||
| 		var mesh_xform = get_node("Armature").get_transform()  | ||||
| 		var facing_mesh=-mesh_xform.basis[0].normalized() | ||||
| 		facing_mesh = (facing_mesh - up*facing_mesh.dot(up)).normalized() | ||||
| 		facing_mesh = adjust_facing(facing_mesh,target_dir,delta,1.0/hspeed*turn_speed,up) | ||||
| 		var m3 = Matrix3(-facing_mesh,up,-facing_mesh.cross(up).normalized()).scaled( CHAR_SCALE ) | ||||
| 		 | ||||
| 		get_node("Armature").set_transform(Transform(m3,mesh_xform.origin)) | ||||
| 				 | ||||
| 		if (not jumping and jump_attempt): | ||||
| 			vv = 7.0 | ||||
| 			jumping = true		 | ||||
| 			get_node("sfx").play("jump") | ||||
| 	else: | ||||
|  | ||||
| 		if (vv>0): | ||||
| 			anim=ANIM_AIR_UP | ||||
| 		else: | ||||
| 			anim=ANIM_AIR_DOWN | ||||
| 			 | ||||
| 		var hs | ||||
| 		if (dir.length()>0.1): | ||||
|  | ||||
| 			hv += target_dir * (accel * 0.2) * delta | ||||
| 			if (hv.length() > max_speed): | ||||
| 				hv = hv.normalized() * max_speed | ||||
|  | ||||
| 		else: | ||||
|  | ||||
| 			if (air_idle_deaccel): | ||||
| 				hspeed = hspeed - (deaccel * 0.2) * delta | ||||
| 				if (hspeed<0): | ||||
| 					hspeed=0 | ||||
|  | ||||
| 				hv = hdir*hspeed | ||||
| 			 | ||||
| 		 | ||||
| 	if (jumping and vv < 0): | ||||
| 		jumping=false | ||||
|  | ||||
| 	lv = hv+up*vv | ||||
| 	 | ||||
| 	 | ||||
|  | ||||
| 	if (onfloor): | ||||
|  | ||||
| 		movement_dir = lv | ||||
| 		#lv += floor_velocity | ||||
| 		last_floor_velocity = floor_velocity | ||||
| 	else: | ||||
|  | ||||
| 		if (on_floor) : | ||||
|  | ||||
| 			#if (keep_jump_inertia): | ||||
| 			#	lv += last_floor_velocity | ||||
| 			pass | ||||
| 		 | ||||
| 		last_floor_velocity = Vector3() | ||||
| 		movement_dir = lv | ||||
| 	 | ||||
| 	on_floor = onfloor | ||||
|  | ||||
| 	state.set_linear_velocity(lv) | ||||
| 	 | ||||
| 	if (shoot_blend>0): | ||||
| 		shoot_blend -= delta * SHOOT_SCALE | ||||
| 		if (shoot_blend<0): | ||||
| 			shoot_blend=0 | ||||
| 	 | ||||
| 	if (shoot_attempt and not prev_shoot): | ||||
| 		shoot_blend = SHOOT_TIME		 | ||||
| 		var bullet = preload("res://bullet.scn").instance() | ||||
| 		bullet.set_transform( get_node("Armature/bullet").get_global_transform().orthonormalized() ) | ||||
| 		get_parent().add_child( bullet ) | ||||
| 		bullet.set_linear_velocity( get_node("Armature/bullet").get_global_transform().basis[2].normalized() * 20 ) | ||||
| 		PS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet | ||||
| 		get_node("sfx").play("shoot") | ||||
| 		 | ||||
| 	prev_shoot = shoot_attempt | ||||
| 	 | ||||
| 	if (onfloor): | ||||
| 		get_node("AnimationTreePlayer").blend2_node_set_amount("walk",hspeed / max_speed) | ||||
| 		 | ||||
| 	get_node("AnimationTreePlayer").transition_node_set_current("state",anim) | ||||
| 	get_node("AnimationTreePlayer").blend2_node_set_amount("gun",min(shoot_blend,1.0)) | ||||
| #	state.set_angular_velocity(Vector3())	 | ||||
| 	 | ||||
| 	 | ||||
|  | ||||
|  | ||||
| func _ready(): | ||||
|  | ||||
|  | ||||
| 	# Initalization here | ||||
| 	get_node("AnimationTreePlayer").set_active(true) | ||||
| 	pass | ||||
|  | ||||
|  | ||||
							
								
								
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								samples/GDScript/pong.gd
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,73 @@ | ||||
|  | ||||
| extends Node2D | ||||
|  | ||||
| # member variables here, example: | ||||
| # var a=2 | ||||
| # var b="textvar" | ||||
| const INITIAL_BALL_SPEED = 80 | ||||
| var ball_speed = INITIAL_BALL_SPEED | ||||
| var screen_size = Vector2(640,400) | ||||
| #default ball direction | ||||
| var direction = Vector2(-1,0) | ||||
| var pad_size = Vector2(8,32) | ||||
| const PAD_SPEED = 150 | ||||
|  | ||||
|  | ||||
| func _process(delta): | ||||
|  | ||||
|  | ||||
| 	# get ball positio and pad rectangles | ||||
| 	var ball_pos = get_node("ball").get_pos() | ||||
| 	var left_rect = Rect2( get_node("left").get_pos() - pad_size*0.5, pad_size ) | ||||
| 	var right_rect = Rect2( get_node("right").get_pos() - pad_size*0.5, pad_size ) | ||||
| 	 | ||||
| 	#integrate new ball postion | ||||
| 	ball_pos+=direction*ball_speed*delta | ||||
| 	 | ||||
| 	#flip when touching roof or floor | ||||
| 	if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)): | ||||
| 		direction.y = -direction.y | ||||
| 		 | ||||
| 	#flip, change direction and increase speed when touching pads	 | ||||
| 	if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)): | ||||
| 		direction.x=-direction.x | ||||
| 		ball_speed*=1.1 | ||||
| 		direction.y=randf()*2.0-1 | ||||
| 		direction = direction.normalized() | ||||
|  | ||||
| 	#check gameover | ||||
| 	if (ball_pos.x<0 or ball_pos.x>screen_size.x): | ||||
| 		ball_pos=screen_size*0.5 | ||||
| 		ball_speed=INITIAL_BALL_SPEED | ||||
| 		direction=Vector2(-1,0) | ||||
| 			 | ||||
| 						 | ||||
| 	get_node("ball").set_pos(ball_pos) | ||||
|  | ||||
| 	#move left pad	 | ||||
| 	var left_pos = get_node("left").get_pos() | ||||
| 	 | ||||
| 	if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")): | ||||
| 		left_pos.y+=-PAD_SPEED*delta | ||||
| 	if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")): | ||||
| 		left_pos.y+=PAD_SPEED*delta | ||||
| 		 | ||||
| 	get_node("left").set_pos(left_pos) | ||||
| 		 | ||||
| 	#move right pad	 | ||||
| 	var right_pos = get_node("right").get_pos() | ||||
| 	 | ||||
| 	if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")): | ||||
| 		right_pos.y+=-PAD_SPEED*delta | ||||
| 	if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")): | ||||
| 		right_pos.y+=PAD_SPEED*delta | ||||
| 		 | ||||
| 	get_node("right").set_pos(right_pos) | ||||
| 	 | ||||
| 	  | ||||
|  | ||||
| func _ready(): | ||||
| 	screen_size = get_viewport_rect().size # get actual size | ||||
| 	pad_size = get_node("left").get_texture().get_size() | ||||
| 	set_process(true) | ||||
|  | ||||
							
								
								
									
										67
									
								
								samples/Golo/adapters.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										67
									
								
								samples/Golo/adapters.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										84
									
								
								samples/Golo/async.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										37
									
								
								samples/Golo/augmentations.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										43
									
								
								samples/Golo/closures.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										34
									
								
								samples/Golo/coin-change.golo
									
									
									
									
									
										Executable 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)) | ||||
| } | ||||
							
								
								
									
										55
									
								
								samples/Golo/collection-literals.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										55
									
								
								samples/Golo/collection-literals.golo
									
									
									
									
									
										Executable 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() | ||||
| } | ||||
|  | ||||
							
								
								
									
										53
									
								
								samples/Golo/context-decorator.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										53
									
								
								samples/Golo/context-decorator.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										83
									
								
								samples/Golo/decorators.golo
									
									
									
									
									
										Executable 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()) | ||||
| } | ||||
							
								
								
									
										88
									
								
								samples/Golo/dynamic-evaluation.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										88
									
								
								samples/Golo/dynamic-evaluation.golo
									
									
									
									
									
										Executable 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) | ||||
| } | ||||
							
								
								
									
										29
									
								
								samples/Golo/dynamic-object-person.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										29
									
								
								samples/Golo/dynamic-object-person.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										34
									
								
								samples/Golo/echo-args.golo
									
									
									
									
									
										Executable 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)) | ||||
|   } | ||||
| } | ||||
|  | ||||
							
								
								
									
										31
									
								
								samples/Golo/enums-thread-state.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								samples/Golo/enums-thread-state.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										39
									
								
								samples/Golo/fibonacci.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										20
									
								
								samples/Golo/helloworld.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										53
									
								
								samples/Golo/http-server.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										65
									
								
								samples/Golo/logdeco.golo
									
									
									
									
									
										Executable 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") | ||||
| } | ||||
							
								
								
									
										40
									
								
								samples/Golo/matching-operator.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										40
									
								
								samples/Golo/matching-operator.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										24
									
								
								samples/Golo/max-int.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										55
									
								
								samples/Golo/memoize.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										43
									
								
								samples/Golo/null-safety.golo
									
									
									
									
									
										Executable 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") | ||||
| } | ||||
|  | ||||
							
								
								
									
										65
									
								
								samples/Golo/prepost-decorators.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										65
									
								
								samples/Golo/prepost-decorators.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										69
									
								
								samples/Golo/structs.golo
									
									
									
									
									
										Executable 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()) | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										43
									
								
								samples/Golo/swing-actionlistener.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										43
									
								
								samples/Golo/swing-actionlistener.golo
									
									
									
									
									
										Executable 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) | ||||
| } | ||||
							
								
								
									
										31
									
								
								samples/Golo/swing-helloworld.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										31
									
								
								samples/Golo/swing-helloworld.golo
									
									
									
									
									
										Executable 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) | ||||
| } | ||||
							
								
								
									
										90
									
								
								samples/Golo/templates-chat-webapp.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										90
									
								
								samples/Golo/templates-chat-webapp.golo
									
									
									
									
									
										Executable 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/") | ||||
| } | ||||
							
								
								
									
										51
									
								
								samples/Golo/util-containers.golo
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										51
									
								
								samples/Golo/util-containers.golo
									
									
									
									
									
										Executable 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
									
								
							
							
						
						
									
										48
									
								
								samples/Golo/workers.golo
									
									
									
									
									
										Executable 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)) | ||||
| } | ||||
|  | ||||
							
								
								
									
										21
									
								
								samples/Graph Modeling Language/sample.gml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								samples/Graph Modeling Language/sample.gml
									
									
									
									
									
										Normal 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 | ||||
|   ] | ||||
| ] | ||||
							
								
								
									
										13
									
								
								samples/Groff/sample.4
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Groff/sample.4
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | ||||
| .TH FOO 1 | ||||
| .SH NAME | ||||
| foo \- bar | ||||
| .SH SYNOPSIS | ||||
| .B foo | ||||
| .I bar | ||||
| .SH DESCRIPTION | ||||
| Foo bar | ||||
| .BR baz | ||||
| quux. | ||||
| .PP | ||||
| .B Foo | ||||
| bar baz. | ||||
							
								
								
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								samples/HTML+ERB/fishbowl.html.erb.deface
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,31 @@ | ||||
| <!-- insert_before '[data-hook="buttons"]' --> | ||||
| <% if Spree::Config[:enable_fishbowl] %> | ||||
| <div class="row"> | ||||
|   <div class="twelve columns" id="fishbowl_preferences"> | ||||
|     <fieldset class="no-border-bottom"> | ||||
|       <legend align="center"><%= t(:fishbowl_settings)%></legend> | ||||
|       <% @fishbowl_options.each do |key| %> | ||||
|           <div class="field"> | ||||
|             <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %> | ||||
|             <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %> | ||||
|           </div> | ||||
|       <% end %> | ||||
|       <div class="field"> | ||||
|         <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %> | ||||
|         <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', "1", Spree::Config[:fishbowl_always_fetch_current_inventory]) %> | ||||
|         <%= t(:always_fetch_current_inventory) %> | ||||
|       </div> | ||||
|       <% if !@location_groups.empty? %> | ||||
|         <div class="field"> | ||||
|           <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %> | ||||
|           <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %> | ||||
|         </div> | ||||
|       <% end %> | ||||
|     </fieldset> | ||||
|   </div> | ||||
| </div> | ||||
|  | ||||
| <script type="text/javascript"> | ||||
|   $('.select2').select2(); | ||||
| </script> | ||||
| <% end %> | ||||
							
								
								
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/HTML+ERB/index.html.erb
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,39 @@ | ||||
| <% provide(:title, @header) %> | ||||
| <% present @users do |user_presenter| %> | ||||
| 	<div class="row key-header"> | ||||
| 		<h1><%= @header %></h1> | ||||
| 	</div> | ||||
|  | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class="row key-table"> | ||||
| 		<div class="small-12 columns"> | ||||
| 			<div class="row key-table-row"> | ||||
| 				<div class="small-2 columns">Name</div> | ||||
| 				<div class="small-3 columns">Email</div> | ||||
| 				<div class="small-1 columns">Chords</div> | ||||
| 				<div class="small-1 columns">Keys</div> | ||||
| 				<div class="small-1 columns">Tunings</div> | ||||
| 				<div class="small-1 columns">Credits</div> | ||||
| 				<div class="small-1 columns">Prem?</div> | ||||
| 				<div class="small-2 columns">Since?</div> | ||||
| 			</div> | ||||
|  | ||||
| 			<% if @users == [] %> | ||||
| 				<div class="row key-table-row"> | ||||
| 					<div class="small-4 small-centered columns">No Users</div> | ||||
| 				</div> | ||||
| 			<% else %> | ||||
| 				<%= render @users %> | ||||
| 			<% end %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<div class='row'> | ||||
| 		<div class='small-12 columns'> | ||||
| 			<%= will_paginate %> | ||||
| 		</div> | ||||
| 	</div> | ||||
| <% end %> | ||||
							
								
								
									
										55
									
								
								samples/Hack/Assert.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								samples/Hack/Assert.hh
									
									
									
									
									
										Normal 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'); | ||||
|   } | ||||
| } | ||||
							
								
								
									
										52
									
								
								samples/Hack/AssertRecipe.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								samples/Hack/AssertRecipe.hh
									
									
									
									
									
										Normal 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; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										39
									
								
								samples/Hack/Controller.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								samples/Hack/Controller.hh
									
									
									
									
									
										Normal 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>; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										52
									
								
								samples/Hack/DBResultRecipe.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										52
									
								
								samples/Hack/DBResultRecipe.hh
									
									
									
									
									
										Normal 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; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										22
									
								
								samples/Hack/Documentation.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								samples/Hack/Documentation.hh
									
									
									
									
									
										Normal 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 →</a>; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										65
									
								
								samples/Hack/FakeDB.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								samples/Hack/FakeDB.hh
									
									
									
									
									
										Normal 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; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										72
									
								
								samples/Hack/GetAndPostRecipe.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								samples/Hack/GetAndPostRecipe.hh
									
									
									
									
									
										Normal 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>; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										30
									
								
								samples/Hack/GetController.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								samples/Hack/GetController.hh
									
									
									
									
									
										Normal 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; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										38
									
								
								samples/Hack/HomeController.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								samples/Hack/HomeController.hh
									
									
									
									
									
										Normal 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>; | ||||
|   } | ||||
| } | ||||
							
								
								
									
										13
									
								
								samples/Hack/MySecureRequest.hh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								samples/Hack/MySecureRequest.hh
									
									
									
									
									
										Normal 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); | ||||
|   } | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user