diff --git a/expreduce/builtin_expression.go b/expreduce/builtin_expression.go index c04c3d2..d199775 100644 --- a/expreduce/builtin_expression.go +++ b/expreduce/builtin_expression.go @@ -29,6 +29,17 @@ func flattenExpr(src *Expression, dst *Expression, level int64, cl *CASLogger) { } } +func leafCount(e Ex) int64 { + if asExpr, isExpr := e.(*Expression); isExpr { + res := int64(0) + for _, part := range asExpr.Parts { + res += leafCount(part) + } + return res + } + return 1 +} + func GetExpressionDefinitions() (defs []Definition) { defs = append(defs, Definition{ Name: "Head", @@ -131,6 +142,15 @@ func GetExpressionDefinitions() (defs []Definition) { return dst }, }) + defs = append(defs, Definition{ + Name: "LeafCount", + legacyEvalFn: func(this *Expression, es *EvalState) Ex { + if len(this.Parts) != 2 { + return this + } + return NewInt(leafCount(this.Parts[1])) + }, + }) defs = append(defs, Definition{ Name: "Flat", OmitDocumentation: true, diff --git a/expreduce/resources.go b/expreduce/resources.go index e1594b3..30109f3 100644 --- a/expreduce/resources.go +++ b/expreduce/resources.go @@ -213,7 +213,7 @@ func resourcesComparisonM() (*asset, error) { return a, nil } -var _resourcesExpressionM = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x58\xcd\x6e\xe3\x36\x10\xbe\xe7\x29\x08\x9f\x36\xad\xea\x8d\xec\x04\x8b\x64\x91\x43\xd0\x26\xd8\x05\x16\x68\xd0\xe4\x66\x68\x61\xda\x1a\xdb\x2a\x24\xca\x15\xa9\xac\x53\x43\xef\xde\x19\xea\x5f\x26\x2d\xa9\x3d\xd4\x40\x6c\x89\xf3\xcd\x70\x7e\x3e\xcd\x50\xf9\x02\xdc\xbf\xbb\x4b\x25\xdf\x02\xbb\x67\x93\x25\xdd\x2f\xe0\xb0\x4f\xbc\x25\x4b\x40\xa5\x89\x90\x4c\xed\x80\xed\x70\x9d\xc5\x1b\x7d\x4d\x62\x90\x32\x88\xc5\x74\xf2\xf9\xe2\x41\xa9\x24\x58\xa5\x0a\xe4\x82\x94\x3d\x34\x73\x7c\x4e\x62\x05\x6b\x05\x7e\xf6\xf9\xe2\x15\xa4\x92\xda\x2e\x49\x2e\x18\x7e\x1e\x5f\x82\x68\x1f\xc2\xe3\x81\xd3\x8f\x5c\xe8\xc5\x5c\xc0\x23\x20\x85\xc5\xc6\x61\xda\x95\xcd\xe2\xe0\x79\x9e\x63\x40\xbc\xbc\x47\xab\x38\x2c\x60\x07\x33\xe6\x5b\x20\x55\x81\x38\x1e\x32\x33\xe6\x39\x4c\x65\x81\xe1\xec\x67\xb6\x32\xa3\xbe\x0a\x05\x5b\x48\x0a\xa0\x6b\x06\xfd\x01\xbc\x74\xc8\x9d\x5a\x20\x5c\x61\xde\x2a\xd8\xec\xe3\xa7\x41\x38\xd7\x86\x7b\xc1\xe4\x8b\x6d\x81\x9a\xb8\x93\xde\x18\xf5\xd7\x07\x1d\xe9\xa5\xce\xad\xa7\xf1\xde\x05\x96\xea\xe2\x37\xd8\xab\x5d\x93\x0e\x7a\xc1\xc4\x07\x9f\x04\x44\x88\x25\x09\x97\x1d\x22\x68\x35\x0b\x13\xb4\x6c\x0c\x15\x5c\x87\xe5\x6e\x6c\xe2\xd8\x1c\xde\xac\x44\x1c\x11\x62\x29\x73\x85\x59\xf1\x84\x2c\x39\x0c\x2f\x2c\xd4\x9a\x37\x76\xd4\x7f\x9e\x05\x58\xb9\x36\xef\x93\x4f\x6f\xfa\x10\x1f\x2d\x88\x59\xd3\x99\xe3\xf1\x98\x65\x99\xb7\x68\x97\xed\x1b\x88\x6d\xbb\x6e\xf9\x8a\xa9\x70\xa1\x96\x58\x2b\x97\x2b\x5a\x4a\x97\x0b\xc7\xd4\xee\xda\x61\x85\x2b\x47\xd7\x99\x39\x73\xe7\xda\x52\x9e\xab\x1a\x68\x41\xb8\x35\xe2\x26\x2b\xc3\x77\xd8\xe3\x53\x9a\x60\x5c\x89\xc1\x8b\x5f\xe3\x28\x02\xa1\x16\x93\x3c\x52\x26\x00\x7c\x26\x62\xc5\x76\xfc\x0d\x18\x67\x4b\x6a\x0f\x4b\xdd\xda\xee\x26\xb6\xdc\x17\x7b\x52\xf2\xd1\x83\x59\x9b\x08\xd5\x0e\xaf\xad\xcc\x72\xc1\xb8\x8a\xa3\x60\xdd\x68\x95\x2c\x90\xec\x6f\x48\x62\xcb\x4e\x75\xfc\xbc\x2f\x41\x33\x1b\x97\x6a\xc8\x64\x07\x61\x18\x4f\x5a\x24\x79\x81\xbf\x52\x10\x6b\x68\xd2\xa4\x5c\x5b\x00\xc6\x06\x18\xed\x74\x3a\x45\xbe\xec\xe2\xd0\x97\x98\xa0\x10\xf3\x43\xf1\xd4\x51\x20\x87\x62\xb6\xc2\xe4\xa5\x18\x1f\xb6\xa8\x35\x0f\xc3\x77\x16\x08\x09\x09\x12\x05\x2f\x50\xcc\x31\xc5\x58\x10\xb6\x49\xc5\x5a\x9d\x0e\x89\x72\x4f\x0b\xc7\x4a\xf1\x00\x96\x55\xd9\xaf\x74\x78\xb2\x4d\x69\x09\x9d\x4f\xce\x3b\x49\x8f\xc2\x1e\x41\x42\x55\x7e\x4a\x4b\x69\xa8\xf4\x1c\x4b\xef\xb0\x39\xf2\xad\xb8\xab\x32\xa7\x97\xcd\xa4\xf8\x3d\x55\x32\xf0\xa1\x1c\x9b\xeb\x18\x67\xc8\x41\x27\xb4\xda\xb2\x36\xc4\xe2\xd5\x9f\x98\x09\xc9\xfc\x58\x73\x34\x82\x64\x0b\x16\x8f\xda\x9b\x9f\x38\x63\x7c\x7a\xae\xbb\x30\x9c\x00\xd5\xc2\x8d\xc3\xae\x2d\x7a\xb3\xab\xae\xe2\x4f\x1d\xb5\x31\x4f\xe2\x63\xb4\x57\xef\xac\xe6\x1d\x92\xad\x8c\x1b\x36\x1b\xfc\x0d\xde\x00\x6b\xe5\x07\x92\xef\xf7\xc0\x93\x33\x25\x29\x6a\x51\x9b\x6a\x78\xa2\xa9\x64\xea\x47\x75\x24\xad\xb4\x59\x66\xeb\xf8\x34\x93\x47\x0d\xa2\x9c\x61\x49\x5b\xe5\x04\x7f\x06\xec\x5e\x1b\xad\x9f\xd6\xf3\xac\x87\x0e\xd3\x20\x93\x25\x67\x90\xa1\x27\x1e\x4a\x38\x21\xd5\xfd\xfd\x90\x34\xbd\x26\x69\x47\x75\xd6\x51\x1d\xb7\xe7\x7f\xd9\xb4\xbd\x6b\xa3\x61\x3e\xbe\xf1\x30\xe5\xaa\xd5\x30\xcb\xb5\x72\xb2\x42\x71\xaf\xfb\x22\xb6\xfd\xf2\xde\xc7\xb4\x26\x51\x3d\x65\xb1\xbb\xbe\x81\x60\x3f\x76\xf8\x95\x0a\x1f\xbb\x23\xf5\x58\x6a\x09\x7e\xa0\x1b\x41\xa7\x49\x96\xfb\x58\x9a\x64\x29\x1e\x32\x8a\xf5\x01\x51\x27\x60\xf2\x05\xf7\xa4\x91\xfc\x61\x86\x64\x71\x2f\xbd\x89\xc3\xf2\xb5\x2a\x2c\x17\x05\x44\x00\x0d\xf0\xda\x0f\x5f\xd7\x10\x11\xa7\x52\xfc\xe0\xe6\x26\xbd\xda\x68\x4b\xae\xc5\x24\x3d\x6b\x12\x7d\xfb\xd4\xeb\x1e\x32\x17\x7f\x66\x03\xbd\xd4\x8e\xcd\x2f\xd1\xaa\xd6\xba\x34\x98\xaf\xea\x6f\x31\xdf\xe0\x04\xe1\x5b\xaf\x4b\xa4\x5f\x70\x01\x67\xe4\x5b\x3e\x7b\xca\xb9\x53\xd2\x81\xc6\xbf\xed\xc0\x45\x16\x74\x95\xe9\xe2\x21\xc4\x03\xbf\xe1\xe5\x89\xb8\xf2\x2f\x4a\x7d\xf3\x7d\x5e\x47\xf9\x1c\xff\x80\x84\x1e\xe8\x79\x5f\x15\x6e\xa6\xdf\xe7\xd3\x13\xc5\x29\x6a\x4e\xbd\xd3\x74\x3c\x21\xd1\xbb\x29\xa1\xb5\xb1\x69\xc1\xb8\x03\x0d\x93\xf6\x44\x91\xdd\x21\xc9\x22\xdc\xc8\x84\x61\xae\xca\x88\xb5\xf7\x83\xd2\xa5\x33\x65\x52\x33\x25\xeb\x29\xe4\x4a\x81\x68\xe6\xaa\x58\x5a\xd0\x41\x0b\x53\xb5\xc9\x6f\x25\x8b\x53\xa5\x0f\x5f\x12\x0f\x2b\x6c\x49\x57\xdd\x6c\x14\x9a\x96\xfe\x50\x48\xc7\x9c\xd4\x4b\x57\x5c\x24\x7e\x7d\x6d\x3c\xd7\x7c\x15\x7b\xf4\x2f\x4a\xf1\x70\x88\x47\x41\x81\xaf\xa9\xfa\xb0\x6b\x99\xd5\x47\x37\xab\x2d\xe2\x8d\xb9\x39\xb7\x51\xf8\x71\x33\x7a\xd1\xb1\x60\xf3\xd3\xd8\x89\x06\x2e\x67\x19\x09\xce\xeb\xe1\x4c\xb3\xaa\x92\xcc\xa2\xfd\x0b\xaa\x9b\x2d\x90\xe4\xbc\x95\x2a\x77\x0f\xf8\x9a\x80\x47\x1c\xe2\x3d\xbd\x0d\xe0\x31\x8f\x63\xbd\x45\xcc\xd6\x3b\x2e\xac\x07\x3e\xf3\x0e\x7d\x1e\x38\xec\xea\x4c\x28\x25\x7a\xb0\x31\xcb\x3f\x3d\x72\xb8\x06\x0f\x36\x65\x19\xef\x63\x53\x6c\x1d\xf5\xe3\x0d\x59\x8e\xbf\x7d\x6a\xdc\xeb\x37\x6d\x79\xa1\xd3\xf0\xfc\x9d\x3e\xd7\xf0\x2c\xce\xb6\x30\xb5\xd9\xdb\xdb\xdb\xff\xc3\xb0\xdb\x6b\xd6\xb5\x1a\xad\x9b\xe1\x3f\x01\x00\x00\xff\xff\xef\xfb\xe8\x45\x77\x14\x00\x00") +var _resourcesExpressionM = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x58\x4b\x6f\xe3\x36\x10\xbe\xe7\x57\xb0\x3e\x25\x5d\xd5\x1b\xd9\x09\xb6\xc9\x22\x87\x60\x9b\x60\x17\x58\xa0\x41\x93\x9b\xa1\xc0\xb4\x35\xb6\x55\xc8\xa4\x2b\x52\x59\xa7\x86\xff\x7b\x67\xa8\xb7\x4c\xda\x52\x7b\xe8\x02\x1b\x4b\x9c\x6f\x86\xf3\xf8\x34\x7c\x7c\x05\x1e\xde\xde\xa6\x8a\x2f\x81\xdd\xb1\xc1\x94\xde\x27\xb0\xdd\x24\xc1\x94\x25\xa0\xd3\x44\x28\xa6\x57\xc0\x56\x38\xce\xe4\xc2\x3c\x93\x18\x94\x8a\xa4\x18\x0e\x3e\x9f\xdd\x6b\x9d\x44\xb3\x54\x83\x9a\x90\x72\x80\x66\x76\x4f\x89\xd4\x30\xd7\x10\xee\x3f\x9f\xbd\x80\xd2\xca\xd8\x25\xc9\x19\xc3\x7f\x0f\xcf\xd1\x7a\x13\xc3\xc3\x96\xd3\x8f\x9a\x98\xc1\x4c\xc0\xd7\x40\x0a\x93\x85\xc7\x8c\x2b\x8b\xc9\x36\x08\x02\xcf\x82\x78\x7e\x5f\xcf\x64\x9c\xc3\xb6\x76\xcc\xf7\x48\xe9\x1c\xb1\xdb\xee\xed\x98\xa7\x38\x55\x39\x86\xb3\x0f\x6c\x66\x47\x7d\x13\x1a\x96\x90\xe4\x40\xdf\x0e\xfa\x03\x78\xe1\x90\x3f\x74\x40\xb8\xc6\xbc\x95\xb0\xd1\xc7\x4f\x9d\x70\xbe\x0b\xf7\x8c\xc9\x17\xcb\x1c\x35\xf0\x07\x27\x63\x34\x7f\xce\x4d\xa4\x17\x26\xb7\x81\xc1\x07\x67\x58\xaa\xb3\xdf\x60\xa3\x57\x75\x3a\x98\x01\x1b\x1f\x42\x12\x10\x21\xa6\x24\x9c\xb6\x88\x60\xd4\x1c\x4c\x30\xb2\x3e\x54\xf0\x3d\x96\xb9\xb1\x90\xd2\x1e\xde\xa8\x40\xec\x10\xe2\x28\x73\x89\x99\xf1\x84\x2c\x79\x0c\x1f\x1c\xd4\x1a\xd7\x66\x34\xff\x03\x07\xb0\x74\x6d\x7c\x4a\x3e\xbc\x3e\x85\xf8\xe8\x40\x8c\xea\xce\xec\x76\xbb\xfd\x7e\x1f\x4c\x9a\x65\xfb\x0e\x62\xd9\xac\x5b\x36\x62\x2b\x5c\x6c\x24\xce\xca\x65\x8a\x8e\xd2\x65\xc2\x3e\xb5\xbb\xf2\x58\xee\xca\xce\xf7\x46\xde\xd8\xbb\x72\x94\xe7\xb2\x02\x3a\x10\x7e\x85\xb8\xde\x17\xe1\x7b\xec\xe1\x31\x4d\x30\xae\xc4\xe2\xc5\x17\xb9\x5e\x83\xd0\x93\x41\x16\x29\x13\x00\x21\x13\x52\xb3\x15\x7f\x03\xc6\xd9\x94\xda\xc3\xd4\xb4\xb6\xdb\x81\x2b\xf7\xf9\x9c\x94\x7c\xf4\x60\xd4\x24\x42\x39\xc3\x4b\x23\xb3\x5c\x30\xae\xe5\x3a\x9a\xd7\x5a\x25\x8b\x14\xfb\x1b\x12\xe9\x98\xa9\x8a\x9f\x9f\x4a\xd0\xc8\xc5\xa5\x0a\x32\x58\x41\x1c\xcb\x41\x83\x24\xcf\xf0\x57\x0a\x62\x0e\x75\x9a\x14\x63\x13\xc0\xd8\x00\xa3\x1d\x0e\x87\xc8\x97\x95\x8c\x43\x85\x09\x8a\x31\x3f\x14\x4f\x15\x05\x72\x48\xb2\x19\x26\x2f\xc5\xf8\xb0\x45\xcd\x79\x1c\xbf\xb3\x48\x28\x48\x90\x28\xf8\x80\x62\x8e\x29\xc6\x82\xb0\x45\x2a\xe6\xfa\x70\x91\x28\xe6\x74\x70\xac\x10\x77\x60\x59\x99\xfd\x52\x87\x27\xcb\x94\x86\xd0\xf9\xe4\xb8\x93\xf4\x29\x6c\x10\x24\x74\xe9\xa7\x72\x94\x86\x4a\xcf\xb1\xf4\x1e\x1b\x23\xdf\xf2\xb7\x32\x73\x66\xd8\x4e\x8a\xdf\x53\xad\xa2\x10\x8a\x65\x73\x2e\x71\x0d\xd9\x9a\x84\x96\x53\x56\x86\x98\x9c\xfd\x89\x99\x50\x2c\x94\x86\xa3\x6b\x48\x96\xe0\xf0\xa8\x39\xf9\x81\x33\xd6\xaf\xe7\xaa\x0d\xc3\x15\xa0\x1c\xb8\xf6\xd8\x95\x43\x6f\x74\xd9\x56\xfc\xb9\xa5\xd6\xe7\x4b\x7c\x58\x6f\xf4\x3b\xab\x78\x87\x64\x2b\xe2\x86\xc5\x02\x7f\xa3\x37\xc0\x5a\x85\x91\xe2\x9b\x0d\xf0\xe4\x48\x49\xf2\x5a\x54\xa6\x6a\x9e\x18\x2a\xd9\xfa\x51\x15\x49\x23\x6d\x8e\xb5\xb5\x7f\x9a\xc9\xa3\x1a\x51\x8e\xb0\xa4\xa9\x72\x80\x3f\x02\xf6\xaf\xac\xd6\x0f\xeb\x79\xd4\x43\x8f\x19\x90\xcd\x92\xd7\xc9\xd0\x23\x8f\x15\x1c\x90\xea\xee\xae\x4b\x9a\x5e\x92\xb4\xa5\x3a\x6a\xa9\xf6\x9b\xf3\xbf\x4c\xda\x9c\xb5\xd6\x30\x1f\xde\x78\x9c\x72\xdd\x68\x98\xc5\x58\xb1\xb2\x42\xfe\x6e\xfa\x22\xb6\xfd\xe2\x3d\xc4\xb4\x26\xeb\x6a\x95\xc5\xee\xfa\x06\x82\xfd\x58\xe1\x9f\x54\x84\xd8\x1d\xa9\xc7\x52\x4b\x08\x23\xd3\x08\x5a\x4d\xb2\x98\xc7\xd1\x24\x0b\x71\x97\xa5\xd8\x6c\x10\x4d\x02\x06\x5f\x71\x4e\x5a\x92\xcf\x47\x48\x16\xff\x22\x18\x78\x2c\x1b\x2b\xc3\xf2\x51\x40\x04\x30\x80\xa0\xf9\xf1\xb5\x0d\x11\x71\x4a\xc5\x73\x3f\x33\x19\x54\x46\x1b\x72\x23\x26\xe9\x51\x93\xe8\xdb\xa7\x93\xee\x21\x73\xf1\x67\xd4\xd1\x4b\xe3\xd8\xf8\x02\xad\x1a\xad\x0b\x8b\xf9\xb2\xfe\x0e\xf3\x35\x4e\x10\xbe\x71\x5c\x22\xfd\x9c\x0b\xb8\x46\xbe\x65\x6b\x4f\xb1\xee\x14\x74\xa0\xe5\xdf\xb5\xe1\x22\x0b\xa6\xca\xf4\x70\x1f\xe3\x86\xdf\x72\x78\x22\xae\xfc\x8b\x52\x5f\xbf\x8e\xab\x28\x9f\xe4\x0f\x48\xe8\x83\x1e\x9f\xaa\xc2\xf5\xf0\x75\x3c\x3c\x50\x1c\xa2\xe6\x30\x38\x4c\xc7\x23\x12\xbd\x9d\x12\x1a\xeb\x9b\x16\x8c\x3b\x32\x30\xe5\x4e\x14\xd9\xed\x92\x2c\xc2\xf5\x4c\x18\xe6\xaa\x88\xd8\x78\xdf\x29\x5d\x26\x53\x36\x35\x5b\xb2\x1e\x63\xae\x35\x88\x7a\xae\xf2\xa1\x09\x6d\xb4\x30\x55\x8b\xec\x55\x31\x99\x6a\xb3\xf9\x52\xb8\x59\x61\x53\x7a\x6a\x67\x23\xd7\x74\xf4\x87\x5c\xda\x67\xa7\x5e\xb8\xe2\x23\xf1\xab\x67\xeb\xbe\xe6\x9b\xd8\xa0\x7f\xeb\x14\x37\x87\xb8\x15\x14\x78\x4c\x35\x9b\x5d\xc7\x5a\xbd\xf3\xf7\x95\x45\x7c\xb1\x37\xe7\x26\x0a\xff\xf9\x7b\x3a\xe8\x38\xb0\xd9\x6e\xec\x40\x03\x87\xf7\x7b\x12\x1c\xd7\xc3\x35\xcd\xa9\x4a\x32\x87\xf6\x2f\xa8\x6e\xb7\x40\x92\xe3\x56\xca\xdc\xdd\xe3\x31\x01\xb7\x38\xc4\x7b\x3a\x0d\xe0\x36\x8f\x63\xbd\x85\x64\xf3\x15\x17\xce\x0d\x9f\x7d\x86\x53\x1e\x78\xec\xf2\x48\x28\x05\xba\xb3\x31\xc7\xa5\x47\x06\x37\xe0\xce\xa6\x1c\xcb\x7b\xdf\x14\x3b\x97\xfa\xfe\x86\x1c\xdb\xdf\x53\x6a\x3c\x38\x6d\xda\x71\xa0\x33\xf0\xec\x4c\x9f\x69\x04\x0e\x67\x1b\x98\xca\xec\xcd\xcd\xcd\xff\x61\xd8\x3f\x69\xd6\x77\x1a\x6d\x5c\x59\xf0\xc5\x17\x99\x0a\xdd\xbc\xb5\xc8\x07\x27\xd0\xba\xb5\x98\xd3\x28\x7d\x34\x31\xe0\xd9\x3d\x6b\x8b\x70\x78\x77\x91\xab\x3b\xaf\x2f\x72\x79\x9f\xbe\x38\xa6\x43\x75\xe1\x16\xff\xe0\xb8\x1e\xfc\xb5\x81\x7a\xa5\x9d\xc3\xec\xf5\x7c\xfe\xd3\xc5\x91\xbb\x8c\x12\x5e\x4f\xcc\x3f\x01\x00\x00\xff\xff\x28\x2f\x78\x75\x90\x15\x00\x00") func resourcesExpressionMBytes() ([]byte, error) { return bindataRead( @@ -228,7 +228,7 @@ func resourcesExpressionM() (*asset, error) { return nil, err } - info := bindataFileInfo{name: "resources/expression.m", size: 5239, mode: os.FileMode(420), modTime: time.Unix(1501042154, 0)} + info := bindataFileInfo{name: "resources/expression.m", size: 5520, mode: os.FileMode(420), modTime: time.Unix(1503981540, 0)} a := &asset{bytes: bytes, info: info} return a, nil } diff --git a/expreduce/resources/expression.m b/expreduce/resources/expression.m index 87c7fe4..7ba5444 100644 --- a/expreduce/resources/expression.m +++ b/expreduce/resources/expression.m @@ -126,3 +126,13 @@ ESameTest[{-1, 1[{{1}, 2}], 3, 4}, Flatten[{-1, {1[{{1}, 2}]}, 3, 4}, 999]] ] }; + +LeafCount::usage = "`LeafCount[e]` returns the count of leaves in `e`."; +Attributes[LeafCount] = {Protected}; +Tests`LeafCount = { + ESimpleExamples[ + ESameTest[3, LeafCount[a+b]], + ESameTest[8, LeafCount[a^2 + b^(c!)]], + ESameTest[1, LeafCount[a]] + ] +};