mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	What is Frege? ------------- Frege is a non-strict, pure functional programming language in the spirit of Haskell for the JVM. It enjoys a strong static type system with type inference. Higher rank types are supported, though type annotations are required for that. Frege programs are compiled to Java and run in a JVM. Existing Java Classes and Methods can be used seamlessly from Frege. The Frege programming language is named after and in honor of Gottlob Frege. Project State: ------------- The compiler, an Eclipse plugin and a provisional version of the documentation can be downloaded from here https://github.com/Frege/frege/releases. The REPL can be downloaded from here https://github.com/Frege/frege-repl/releases. An online REPL is running here http://try.frege-lang.org/. Examples: -------- 1) Command Line Clock: https://github.com/Frege/frege/blob/master/examples/CommandLineClock.fr 2) Brainfuck: https://github.com/Frege/frege/blob/master/examples/Brainfuck.fr 3) Concurrency: https://github.com/Frege/frege/blob/master/examples/Concurrent.fr 4) Sudoku: https://github.com/Frege/frege/blob/master/examples/Sudoku.fr 5) Java Swing examples: https://github.com/Frege/frege/blob/master/examples/SwingExamples.fr
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
module examples.Concurrent where
 | 
						||
 | 
						||
import System.Random
 | 
						||
import Java.Net (URL)
 | 
						||
import Control.Concurrent as C
 | 
						||
 | 
						||
main2 args = do
 | 
						||
    m <- newEmptyMVar
 | 
						||
    forkIO do
 | 
						||
        m.put 'x'
 | 
						||
        m.put 'y' 
 | 
						||
        m.put 'z'
 | 
						||
    replicateM_ 3 do
 | 
						||
        c <- m.take
 | 
						||
        print "got: "
 | 
						||
        println c  
 | 
						||
        
 | 
						||
            
 | 
						||
example1 = do
 | 
						||
    forkIO (replicateM_ 100000 (putChar 'a'))
 | 
						||
    replicateM_ 100000 (putChar 'b')
 | 
						||
 | 
						||
example2 =  do
 | 
						||
    s <- getLine
 | 
						||
    case s.long of
 | 
						||
        Right n -> forkIO (setReminder n) >> example2
 | 
						||
        Left _  -> println ("exiting ...")
 | 
						||
    
 | 
						||
setReminder :: Long -> IO ()
 | 
						||
setReminder n = do
 | 
						||
        println ("Ok, I remind you in " ++ show n ++ " seconds")
 | 
						||
        Thread.sleep (1000L*n)
 | 
						||
        println (show n ++ " seconds is up!")
 | 
						||
 | 
						||
table = "table"
 | 
						||
            
 | 
						||
mainPhil _ = do
 | 
						||
    [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5]
 | 
						||
    forkIO (philosopher "Kant" fork5 fork1)
 | 
						||
    forkIO (philosopher "Locke" fork1 fork2)
 | 
						||
    forkIO (philosopher "Wittgenstein" fork2 fork3)
 | 
						||
    forkIO (philosopher "Nozick" fork3 fork4)
 | 
						||
    forkIO (philosopher "Mises" fork4 fork5)
 | 
						||
    return ()    
 | 
						||
 | 
						||
philosopher :: String -> MVar Int -> MVar Int -> IO ()
 | 
						||
philosopher me left right = do
 | 
						||
    g <- Random.newStdGen
 | 
						||
    let phil g  = do
 | 
						||
            let (tT,g1) = Random.randomR (60L, 120L) g
 | 
						||
                (eT, g2)  = Random.randomR (80L, 160L) g1
 | 
						||
                thinkTime = 300L * tT
 | 
						||
                eatTime   = 300L * eT
 | 
						||
    
 | 
						||
            println(me ++ " is going to the dining room and takes his seat.") 
 | 
						||
            fl <- left.take            
 | 
						||
            println (me ++ " takes up left fork (" ++ show fl ++ ")")
 | 
						||
            rFork <- right.poll
 | 
						||
            case rFork of
 | 
						||
                Just fr -> do 
 | 
						||
                    println (me ++ " takes up right fork. (" ++ show fr ++ ")") 
 | 
						||
                    println (me ++ " is going to eat for " ++ show eatTime ++ "ms")
 | 
						||
                    Thread.sleep eatTime
 | 
						||
                    println (me ++ " finished eating.")
 | 
						||
                    right.put fr
 | 
						||
                    println (me ++ " took down right fork.")
 | 
						||
                    left.put fl
 | 
						||
                    println (me ++ " took down left fork.")
 | 
						||
                    table.notifyAll 
 | 
						||
                    println(me ++ " is going to think for " ++ show thinkTime ++ "ms.")
 | 
						||
                    Thread.sleep thinkTime
 | 
						||
                    phil g2
 | 
						||
                Nothing -> do
 | 
						||
                    println (me ++ " finds right fork is already in use.")
 | 
						||
                    left.put fl
 | 
						||
                    println (me ++ " took down left fork.")
 | 
						||
                    table.notifyAll
 | 
						||
                    println (me ++ " is going to the bar to await notifications from table.")
 | 
						||
                    table.wait
 | 
						||
                    println (me ++ " got notice that something changed at the table.")
 | 
						||
                    phil g2
 | 
						||
            
 | 
						||
        inter :: InterruptedException -> IO ()
 | 
						||
        inter _ = return ()        
 | 
						||
    
 | 
						||
    phil g `catch` inter
 | 
						||
 | 
						||
    
 | 
						||
getURL xx = do
 | 
						||
        url <- URL.new xx 
 | 
						||
        con <- url.openConnection
 | 
						||
        con.connect
 | 
						||
        is  <- con.getInputStream
 | 
						||
        typ <- con.getContentType
 | 
						||
        -- stderr.println ("content-type is " ++ show typ) 
 | 
						||
        ir  <- InputStreamReader.new is (fromMaybe "UTF-8" (charset typ))
 | 
						||
            `catch` unsupportedEncoding is 
 | 
						||
        br  <- BufferedReader.new ir
 | 
						||
        br.getLines
 | 
						||
    where
 | 
						||
        unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader
 | 
						||
        unsupportedEncoding is x = do
 | 
						||
            stderr.println x.catched
 | 
						||
            InputStreamReader.new is "UTF-8"
 | 
						||
            
 | 
						||
        charset ctyp = do
 | 
						||
            typ <- ctyp
 | 
						||
            case typ of
 | 
						||
                m~´charset=(\S+)´ -> m.group 1
 | 
						||
                _ -> Nothing
 | 
						||
 | 
						||
    
 | 
						||
type SomeException = Throwable
 | 
						||
 | 
						||
main ["dining"] = mainPhil []
 | 
						||
        
 | 
						||
main _ =  do
 | 
						||
    m1 <- MVar.newEmpty
 | 
						||
    m2 <- MVar.newEmpty
 | 
						||
    m3 <- MVar.newEmpty
 | 
						||
    
 | 
						||
    forkIO do
 | 
						||
        r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Haskell"
 | 
						||
        m1.put r
 | 
						||
    
 | 
						||
    forkIO do
 | 
						||
        r <- (catchAll . getURL) "htto://www.wikipedia.org/wiki/Java"
 | 
						||
        m2.put r
 | 
						||
    
 | 
						||
    forkIO do
 | 
						||
        r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Frege"
 | 
						||
        m3.put r
 | 
						||
    
 | 
						||
    r1 <- m1.take
 | 
						||
    r2 <- m2.take
 | 
						||
    r3 <- m3.take
 | 
						||
    println (result r1, result r2, result r3)
 | 
						||
    -- case r3 of
 | 
						||
    --     Right ss -> mapM_ putStrLn ss
 | 
						||
    --     Left _   -> return ()
 | 
						||
  where
 | 
						||
    result :: (SomeException|[String]) -> (String|Int)
 | 
						||
    result (Left x)  = Left x.getClass.getName
 | 
						||
    result (Right y) = (Right . sum . map length)  y
 | 
						||
    -- mapM_ putStrLn r2
 | 
						||
 | 
						||
         |