I have these let variables
    
    
    from os import getEnv
    from strutils import parseInt, isEmptyOrWhitespace
    
    let
        
        SERVER_HOST* : string = block :
            
            var host : string = "localhost" ## default host localhost
            let env_host = getEnv("HOST")
            if not env_host.isEmptyOrWhitespace():
                
                host = env_host
            
            host
        
        SERVER_PORT* : int = block :
            
            var port : int = 5000 ## default port 5000
            let env_port = getEnv("PORT")
            if not env_port.isEmptyOrWhitespace():
                
                port = parseInt(env_port)
            
            port
        
        MONGO_HOST* : string = block :
            
            var host : string = "localhost" ## default host localhost
            let env_host = getEnv("MONGO_HOST")
            if not env_host.isEmptyOrWhitespace():
                
                host = env_host
            
            host
        
        MONGO_PORT* : int = block :
            
            var port : int = 27017 ## default port 27017
            let env_port = getEnv("MONGO_PORT")
            if not env_port.isEmptyOrWhitespace():
                
                port = parseInt(env_port)
            
            port
        
        RATE_LIMIT* : int = block :
            
            var limit : int = 200 ## default limit 200 calls
            let env_limit = getEnv("RATE_LIMIT")
            if not env_limit.isEmptyOrWhitespace():
                
                limit = parseInt(env_limit)
            
            limit
        
        LIMIT_FREQ* : int = block :
            
            var freq : int = 60 ## default freq 60 seconds
            let env_freq = getEnv("LIMIT_FREQ")
            if not env_freq.isEmptyOrWhitespace():
                
                freq = parseInt(env_freq)
            
            freq
    
    
    Run

These variables are declared in a separate file from where they would be used 
because i want to avoid re declaring them again. I need to call these variables 
in a `proc` that would be spawned by the threadpool library but the nim 
compiler says they are not gc safe even though let variables are immutable. I 
also tried using the isolation library but because the `isolate proc` only 
accepts var variables i can't. Is there a reason the compiler finds let 
variables to not be gc safe or is this a bug? By the way here is a part of the 
proc from which i called the variables
    
    
    proc server() {.gcsafe.} =
        
        let mongo = newMongo[AsyncSocket](MongoUri 
fmt"mongodb://{MONGO_HOST}:{MONGO_PORT}/")
        mongo.noSlave()
        
        if not waitFor mongo.connect():
            
            fatal(fmt"Failed to bind to mongodb on host {MONGO_HOST} at port 
{MONGO_PORT}")
            info("Quiting...")
            quit(QuitFailure)
        
        let db = mongo["blog_db"]
        
        settings:
            
            port = Port SERVER_PORT
            bindAddr = SERVER_HOST
    
    
    Run

Reply via email to