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.
		
		
		
		
		
			
		
			
				
					90 lines
				
				2.2 KiB
			
		
		
			
		
	
	
					90 lines
				
				2.2 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								# generate-function
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Module that helps you write generated functions in Node
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								npm install generate-function
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								[](http://travis-ci.org/mafintosh/generate-function)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Disclamer
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								Writing code that generates code is hard.
							 | 
						||
| 
								 | 
							
								You should only use this if you really, really, really need this for performance reasons (like schema validators / parsers etc).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Usage
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``` js
							 | 
						||
| 
								 | 
							
								const genfun = require('generate-function')
							 | 
						||
| 
								 | 
							
								const { d } = genfun.formats
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function addNumber (val) {
							 | 
						||
| 
								 | 
							
								  const gen = genfun()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  gen(`
							 | 
						||
| 
								 | 
							
								    function add (n) {')
							 | 
						||
| 
								 | 
							
								      return n + ${d(val)}) // supports format strings to insert values
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  `)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return gen.toFunction() // will compile the function
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const add2 = addNumber(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log('1 + 2 =', add2(1))
							 | 
						||
| 
								 | 
							
								console.log(add2.toString()) // prints the generated function
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need to close over variables in your generated function pass them to `toFunction(scope)`
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								``` js
							 | 
						||
| 
								 | 
							
								function multiply (a, b) {
							 | 
						||
| 
								 | 
							
								  return a * b
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function addAndMultiplyNumber (val) {
							 | 
						||
| 
								 | 
							
								  const gen = genfun()
							 | 
						||
| 
								 | 
							
								  
							 | 
						||
| 
								 | 
							
								  gen(`
							 | 
						||
| 
								 | 
							
								    function (n) {
							 | 
						||
| 
								 | 
							
								      if (typeof n !== 'number') {
							 | 
						||
| 
								 | 
							
								        throw new Error('argument should be a number')
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      const result = multiply(${d(val)}, n + ${d(val)})
							 | 
						||
| 
								 | 
							
								      return result
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  `)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  // use gen.toString() if you want to see the generated source
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return gen.toFunction({multiply})
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const addAndMultiply2 = addAndMultiplyNumber(2)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								console.log(addAndMultiply2.toString())
							 | 
						||
| 
								 | 
							
								console.log('(3 + 2) * 2 =', addAndMultiply2(3))
							 | 
						||
| 
								 | 
							
								```
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								You can call `gen(src)` as many times as you want to append more source code to the function.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Variables
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need a unique safe identifier for the scope of the generated function call `str = gen.sym('friendlyName')`.
							 | 
						||
| 
								 | 
							
								These are safe to use for variable names etc.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## Object properties
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you need to access an object property use the `str = gen.property('objectName', 'propertyName')`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								This returns `'objectName.propertyName'` if `propertyName` is safe to use as a variable. Otherwise
							 | 
						||
| 
								 | 
							
								it returns `objectName[propertyNameAsString]`.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								If you only pass `gen.property('propertyName')` it will only return the `propertyName` part safely
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								## License
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								MIT
							 |