You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							161 lines
						
					
					
						
							4.1 KiB
						
					
					
				
			
		
		
	
	
							161 lines
						
					
					
						
							4.1 KiB
						
					
					
				| function testFloats() { | |
|     const nums = new Array(100_00).fill(0).map(_ => Math.random()); | |
|     const strings = nums.map(num => num.toString()); | |
|     const indexes = strings.map(num => { | |
| 	const str = new TextEncoder().encode(num); | |
| 	const index = instance.exports.alloc(str.length); | |
| 	for (let i = 0; i < str.length; i++) { | |
| 	    buffer[index + i] = str[i]; | |
| 	} | |
|  | |
| 	return {index, length: str.length}; | |
|     }); | |
|  | |
|     let start = Date.now(); | |
|     for (let i = 0; i < indexes.length; i++) { | |
| 	const buf = indexes[i]; | |
| 	const result = instance.exports.parse_float(buf.index, buf.length); | |
|     } | |
|     let end = Date.now(); | |
|     console.log(`WASM elasped: ${end - start}`); | |
|     for (let i = 0; i < indexes.length; i++) { | |
| 	const buf = indexes[i]; | |
| 	instance.exports.free(buf.index, buf.length); | |
|     } | |
|  | |
|     start = Date.now(); | |
|     for (let i = 0; i < strings.length; i++) { | |
| 	const result = parseFloat(strings[i]); | |
|     } | |
|     end = Date.now(); | |
|     console.log(`JS elasped: ${end - start}`); | |
| } | |
|  | |
| async function main() { | |
|     // WASM | |
|     // const response = await fetch('./lisp.wasm'); | |
|     // const bytes = await response.arrayBuffer(); | |
|  | |
|     var fs = require('fs'); | |
|     const bytes = await fs.readFileSync('./lisp.wasm') | |
|     const results = await WebAssembly.instantiate(bytes, { | |
| 	env: { | |
| 	    jsprint: (byteOffset) => { | |
| 		let s = ''; | |
| 		const a = new Uint8Array(memory.buffer); | |
| 		for (var i = byteOffset; a[i]; i++) { | |
| 		    s += String.fromCharCode(a[i]); | |
| 		} | |
| 		 | |
| 		console.log(s) | |
| 	    } | |
| 	} | |
|     }); | |
|     const instance = results.instance; | |
|     const memory = instance.exports.pagememory; | |
|     const buffer = new Uint8Array(memory.buffer); | |
|     // const str = new TextEncoder().encode('(let ((a 1) (b 2) (c (+ 1 a))) (+ a b c))\0'); | |
| //     const str = new TextEncoder().encode(` | |
| // (set-macro-character #\\' (fn (c) (list (quote quote) (read)))) | |
| // (car (list 1 2)) | |
| // \0`); | |
|     const str = new TextEncoder().encode(` | |
| (set-macro-character #\\' (fn (c) (list (quote quote) (read)))) | |
| (defmacro defn (name args &body body) (list def name (cons fn (cons args body)))) | |
| (defn reverse (lst) | |
|   (let ((lp (fn (lst rslt) | |
|     (if (car lst) | |
|       (lp (cdr lst) (cons (car lst) rslt)) | |
|       rslt)))) | |
|     (lp lst nil))) | |
| (defn map (lst f)  | |
|   (let ((lp  | |
|     (fn (lst rslt) | |
|       (if (car lst) | |
|         (lp (cdr lst) (cons (f (car lst)) rslt)) | |
|         rslt)))) | |
|     (reverse (lp lst nil)))) | |
| (set-macro-character #\\\` (fn (c) (list (quote quote) (read)))) | |
| (defn fact (n) | |
|   (if (= n 0) | |
|     1 | |
|     (* n (fact (- n 1))))) | |
| (fact 6) | |
|  | |
| (defn fact* (n) | |
|   (let ((i 0) (fact 1)) | |
|     (loop (if (= i n) break) | |
|           (set i (+ i 1)) | |
|           (set fact (* fact i))) | |
|     fact)) | |
|  | |
| (fact* 6) | |
|  | |
| (defn fact** (n) | |
|   (let ((fact-tail (fn (n fact) | |
|                      (if (<= n 1) | |
|                        fact | |
|                        (fact-tail (- n 1) (* n fact)))))) | |
|     (fact-tail n 1))) | |
| (fact** 6) | |
|  | |
| (defn fact*** (n) | |
|   (let ((fact 1)) | |
|     (loop (if (<= n 1) break) | |
|           (set fact (* fact n)) | |
|           (set n (- n 1))) | |
|     fact)) | |
| (fact*** 6) | |
|  | |
| (let ((count 0)) | |
|  (loop (set count (+ count 1)) | |
|       (print count) | |
|       (if (>= count 5) break nil))) | |
|  | |
| (def d 5) | |
| (defn addd (a b) (+ a b d)) | |
| (addd 1 2) | |
| (let ((d 10)) (addd 1 2)) | |
| \0`); | |
|     // const str = new TextEncoder().encode('+'); | |
|     const index = instance.exports.alloc(str.length); | |
|     for (let i = 0; i < str.length; i++) { | |
| 	buffer[index + i] = str[i]; | |
|     } | |
|  | |
|     let result = 0; | |
|     try { | |
| 	result = instance.exports.rep(index); | |
|     } catch(e) { | |
| 	console.error(e); | |
| 	result = instance.exports.outputStream(); | |
|     } | |
|     let print = ''; | |
|     for (let i = 0, c = buffer[result + i]; | |
| 	 c != 0; | |
| 	 i++, c = buffer[result + i]){ | |
| 	print += String.fromCharCode(c); | |
|     } | |
|     console.log(print); | |
|  | |
|  | |
|     let string = ''; | |
|     let dept = 64; | |
|     for (let i = 0; i < dept; i += 4) { | |
| 	// string += `0x${buffer[i].toString(16)} `; | |
| 	for (let col = 0; col < 4; col++) { | |
| 	    string += `${i + col * dept}:\t`; | |
| 	    for (let x = 0; x < 4; x++) { | |
| 		string += ` ${buffer[i + x + col * dept].toString(16).padStart(2, '0').toUpperCase()}`; | |
| 	    } | |
| 	    string += '\t'; | |
| 	} | |
| 	string += '\n'; | |
|     } | |
|     // console.log(string); | |
|  | |
|     //instance.exports.helloworld(); | |
|     // console.log(instance.exports.align(parseInt(process.argv[2]), 8)); | |
| } | |
|  | |
| main();
 | |
| 
 |