4 ms·
Can array languages be used as general purpose languages in any practical way? Or are they really only strong as calculators?
by haolez 3y ago
Can array languages be used as general purpose languages in any practical way? Or are they really only strong as calculators?
- hoosieree 3y agoThey can be. I know J has libraries for databases, image, audio processing, etc. I've written an assembler in J and translated it to K. The array languages are pretty decent for prototyping machine learning stuff. Often you don't need any libraries at all. Here's a 2-layer perceptron, first in Python+NumPy: import numpy as np X = np.array([[0,0,1], [0,1,1], [1,0,1], [1,1,1]]) y = np.array([[0,1,1,0]]).T np.random.seed(1) w0 = 2*np.random.random((3,4)) - 1 w1 = 2*np.random.random((4,1)) - 1 for j in range(10000): l1 = 1/(1+np.exp(-(X @ w0))) l2 = 1/(1+np.exp(-(l1 @ w1))) l2_error = y - l2 l2_delta = l2_error * l2 * (1 - l2) l1_error = l2_delta @ w1.T l1_delta = l1_error * l1 * (1 - l1) w0 += X.T @ l1_delta w1 += l1.T @ l2_delta print(np.round(l2,3)) [[0.007] [0.991] [0.992] [0.01 ]] And again in J: input =: 4 3 $ 0 0 1 0 1 1 1 0 1 1 1 1 target =: 4 1 $ 0 1 1 0 dot =: +/ .* sig =: {{ %>:^-y }} train =: {{ 'ignore_me w0 w1' =. y l1 =. sig input dot w0 l2 =. sig l1 dot w1 l2_error =. target - l2 l2_delta =. l2_error * l2 * 1 - l2 l1_error =. l2_delta dot |: w1 l1_delta =. l1_error * l1 * 1 - l1 w0 =. w0 + (|:input) dot l1_delta w1 =. w1 + (|:l1) dot l2_delta l2;w0;w1 }} 5j3":0{::train^:10000 {{<:+:?.y$0}} each 1 ; 3 4 ; 4 1 0.009 0.990 0.990 0.011 Here's that assembler (for the Nand2Tetris assembly language) in K. It's intentionally golfed. L:({x^"\r "}'*'"/"\'0:0)^,"" T:(("R",'$!16)!!16),(($`SCREEN`KBD`SP`LCL`ARG`THIS`THAT)!16384,24576,!5),((-1_1_)'L@&i)!{x-!#x}@&i:"("=*'L T,:n!16+!#n:?(({$[("@"=*x)&^`I$1_x;1_x;`]}'L)^!T)^` C:(" "\"D&A D+A A-D D !D D-1 -D D-A D|A D+1 0 A !A A-1 -A A+1 -1 1")!0 2 7 12 13 14 15 19 21 31 42 48 49 50 51 55 58 63 D:$`" "`M`D`MD`A`AM`AD`AMD J:$`" "`GT`EQ`GE`LT`NE`LE`MP B:{,/$(x#2)\y} P:{c:*d:|"="\*j:";"\x;"111",/(B.7,(64*|/"M"=c)+C@"A"/"M"\c;B.3,D??d 1;B.3,J??1_j 1)} `0:({(P;{"0"^-16$,/$2\(`I$1_x)^T@1_x})[2/"@"=*x;x]}'L)@&~i
- jodrellblank 3y agoDyalog APL is the one I'm most familiar with; as well as its array language syntax it has procedural-style keywords for control flow[1] like if/then/else and do/loop and so on. It has OOP class syntax too, and .NET framework bindings for event-driven Windows Forms GUIs and calling C#/.NET DLLs or building APL-based DLLs for other .NET languages. So yes, but you're not writing much array style code to do those parts. As well as being usable for the back end of a webserver. [1] https://help.dyalog.com/latest/#Language/Control%20Structures/while.htm?TocPath=Programming%2520Reference%2520Guide%257CDefined%2520Functions%2520and%2520Operators%257CTraditional%2520Functions%2520and%2520Operators%257CControl%2520Structures%257C_____3 https://help.dyalog.com/latest/#Language/Control%20Structure...
- razetime 3y agoarray languages are used by several companies for their work. K for example is pretty popular in fintech. Some present companies provide services for array languages as well. https://www.dyalog.com/case-studies/index.htm https://www.dyalog.com/case-studies/index.htm https://github.com/interregna/arraylanguage-companies https://github.com/interregna/arraylanguage-companies