Studie zeigt C als beliebteste Sprache in offenen Projekten
-
ist Forth genügend DSL-fähig ? Denke schon.
11 1 DO I . LOOP 0 11 1 DO I + LOOP .
-
\newcount\s\s=0\newcount\n\n=1\loop\number\n\ \advance\s by\n\advance\n by1\ifnum\n<10\repeat\number\s\end 1 2 3 4 5 6 7 8 9 10 55
-
sum [1..10]
In Haskell (ist auch nur ein modernes Lisp)! Auch ist es nicht schlimm wie in der Lispversion mehr Woerter zu nutzen. Nennt sich literate programming. Die Smalltalkversion wird dem nicht gerecht.
-
knivil schrieb:
Nennt sich literate programming.
Der arme Knuth.
-
u-ser_l schrieb:
ist Forth genügend DSL-fähig ? Denke schon.
11 1 DO I . LOOP 0 11 1 DO I + LOOP .
Kann ich nicht beurteilen, dazu müsstest du schon noch ein Beispiel dazulegen wie es aussehen würde, wenn du Forth nutzt und keine in Forth implementierte DSL.
Bei Common Lisp wäre eine Lisp-Variante:
(let ((sum 0)) (dotimes (i 10) (incf sum (1+ i))) (print sum)) (let ((numbers nil)) (dotimes (i 10) (push (1+ i) numbers)) (print (nreverse numbers)))
Egal wie man es macht, die loop-Varianten versteht jeder sofort ohne nachzudenken.
-
LISPer schrieb:
u-ser_l schrieb:
ist Forth genügend DSL-fähig ? Denke schon.
11 1 DO I . LOOP 0 11 1 DO I + LOOP .
Kann ich nicht beurteilen, dazu müsstest du schon noch ein Beispiel dazulegen wie es aussehen würde, wenn du Forth nutzt und keine in Forth implementierte DSL.
Bei Common Lisp wäre eine Lisp-Variante:
(let ((sum 0)) (dotimes (i 10) (incf sum (1+ i))) (print sum)) (let ((numbers nil)) (dotimes (i 10) (push (1+ i) numbers)) (print (nreverse numbers)))
Egal wie man es macht, die loop-Varianten versteht jeder sofort ohne nachzudenken.
Der letze Satz bezieht sich auf Common Lisp.
-
LISPer schrieb:
dazu müsstest du schon noch ein Beispiel dazulegen wie es aussehen würde, wenn du Forth nutzt und keine in Forth implementierte DSL.
das ist Forth und keine DSL
11 1 DO I . LOOP 0 11 1 DO I + LOOP .
-
aber wenn Dir das nicht kryptisch genug ist - kein Problem:
: {{ 1 ; : }= 11 ; : #?@ I . ; : !&x DO ; : +*-u LOOP ; }= {{ !&x #?@ +*-u
-
u-ser_l schrieb:
aber wenn Dir das nicht kryptisch genug ist - kein Problem:
: {{ 1 ; : }= 11 ; : #?@ I . ; : !&x DO ; : +*-u LOOP ; }= {{ !&x #?@ +*-u
Ist da Deine Katze ueber die Tastatur gelaufen oder wie kommt so etwas zustande?
-
Berechnet Summe von 1 bis 10 ohne Ausgabe:
+++[>+++<-]>+[[<+>>+<-]>[<+>-]<-]<
dazu passende Ausgabe:
>++++++++++[->>+>+<<<]>>>[-<<<+>>>]<-<<<[>>>[->+>+<<]>>[-<<+>>]+<[[-]>-<]>[-<+>]<[[-]<<+<[->>+>+<<<]>>>[-<<<+>>>]]<-<<<-]>>[-<<+>>]>[-<<->>]<<-[->+<]<[->+<]>>[-<<+>>]+++[->++++<]>[-<++++>]<[-<+>]<.[-]+++[->++++<]>[-<++++>]<[-<+>]<.[-]<
-
Nerds unter sich.
-
Volkard sein Posting war glaube ich Brainfuck, oder irre ich mich?
-
Ivo schrieb:
Volkard sein Posting war glaube ich Brainfuck, oder irre ich mich?
Jo, Brainfuck.
-
Ivo schrieb:
: {{ 1 ; : }= 11 ; : #?@ I . ; : !&x DO ; : +*-u LOOP ; }= {{ !&x #?@ +*-u
Ist da Deine Katze ueber die Tastatur gelaufen oder wie kommt so etwas zustande?
ja, so ähnlich - der Fiebertraum eines Programmierers kurz vor dem Aufwachen, nach zwei Pizzas spät abends
Das ist natürlich dasselbe wie
11 1 DO I . LOOP
nur mit den 5 Ersetzungen, die jeweils zwischen : und ; stehen:
{{ für 1
!&x für DO
usw.
-
Ivo schrieb:
Volkard sein Posting
*Kopfschmerzen
-
noch einer
seq 10|tr ' > ' +|cut -b-20|bc 55
-
Ok, jetzt habt ihr ja alles durch. Dann können wir ja zum Thema zurück.
Mit DSL meine ich so etwas:#include <stdio.h> #define SEQ(start, end) do { int i = start; for(; i <= end; ++i) { #define QES } } while(0); #define SUM(start, end) do { int sum = 0; SEQ(start, end) sum += i; QES #define MUS } while(0); int main() { /***************DSL begin*************************/ SEQ(1, 10) printf("%d ", i); QES SUM(1, 10) printf("%d ", sum); MUS /***************DSL end***************************/ }
Man sieht natürlich die offensichtlichen Schwächen von C was das Erweitern der Sprache angeht (das notwendige QES am Ende). Man könnte das natürlich deutlich flexibler und komplexer gestalten, aber um die Implementierung ging es hier ja nicht, sondern um das Aussehen beim anwenden.
-
^^mach so:
#define SEQ(start, end, func) do { int i = start; for(; i <= end; ++i) {char s[8]; sprintf(s, "%d ", i); func(s);}}while(0)
und dann
SEQ(1, 10, puts); // oder SEQ(1, 10, printf);
-
in Forth geht das sehr ähnlich, nur kürzer und ohne Präpro-'Ferkeleien'
: SEQ DO ; : QES LOOP ; : SUM 0 -ROT DO ; : MUS LOOP ; 11 1 SEQ I . QES 11 1 SUM I + DUP . MUS
-
^^das kürzeste ist immer noch das: http://www.wolframalpha.com/input/?i=1+to+10
mit allen outputs und noch mehr.