루시드(Lucid)는 폰 노이만 구조를 따르지 않는 프로그래밍 모델을 갖춘 실험적으로 설계된 데이터플로 프로그래밍 언어이다. 빌 웨지(Bill Wadge)와 에드 애시크로프트(Ed Ashcroft)에 의해 설계되었으며 1985년 책 "데이터플로 프로그래밍 언어, 루시드"(Lucid, the Dataflow Programming Language)에 기술되었다.[1]
루시드는 데이터 계산을 위해 수요 중심 모델을 사용한다. 각 진술은 프로세서 네트워크와 데이터가 흐르는 통신 회선을 정의하는 방정식으로 이해될 수 있다. 각 변수는 값의 무한한 흐름이며 모든 함수는 필터 또는 변환기(transformer)이다. 반복문은 스트림 구성을 허용하는 '현재' 값과 'fby'('followed by'로 읽음) 연산자로 시뮬레이션된다.
prime
where
prime = 2 fby (n whenever isprime(n));
n = 3 fby n+1;
isprime(n) = not(divs) asa divs or prime*prime > N
where
N is current n;
divs = N mod prime eq 0;
end;
end
qsort(a) = if eof(first a) then a else follow(qsort(b0),qsort(b1)) fi
where
p = first a < a;
b0 = a whenever p;
b1 = a whenever not p;
follow(x,y) = if xdone then y upon xdone else x fi
where
xdone = iseod x fby xdone or iseod x;
end
end
데이터 흐름도
--------> whenever -----> qsort ---------
| ^ |
| | |
| not |
| ^ |
|---> first | |
| | | |
| V | |
|---> less --- |
| | |
| V V
---+--------> whenever -----> qsort -----> conc -------> ifthenelse ----->
| ^ ^
| | |
--------> next ----> first ------> iseod -------------- |
| |
-----------------------------------------------------------
sqroot(avg(square(a)))
where
square(x) = x*x;
avg(y) = mean
where
n = 1 fby n+1;
mean = first y fby mean + d;
d = (next y - mean)/(n+1);
end;
sqroot(z) = approx asa err < 0.0001
where
Z is current z;
approx = Z/2 fby (approx + Z/approx)/2;
err = abs(square(approx)-Z);
end;
end