Skip to content

Instantly share code, notes, and snippets.

View newlawrence's full-sized avatar

Alberto Lorenzo Márquez newlawrence

View GitHub Profile
@newlawrence
newlawrence / memoized_property.py
Last active January 13, 2017 14:51
A simple decorator to define memoized properties in Python
import weakref
class memoized_property(property):
def __init__(self, *args, **kwargs):
super(memoized_property, self).__init__(*args, **kwargs)
self.data = weakref.WeakKeyDictionary()
def __get__(self, instance, owner=None):
@newlawrence
newlawrence / little_parser.py
Last active May 29, 2017 12:10
A quick and dirty implementation of a math expression parser in Python
import math
def parse(expression, variables=None, context=vars(math)):
variables = ','.join(variables) if variables is not None else ''
context = dict(context) if context is not None else {}
return eval('lambda {}: {}'.format(variables, expression), None, context)
@newlawrence
newlawrence / plural_maker.hs
Last active February 7, 2017 21:25
A proof of concept of a small plural sentences creator
import qualified Data.Char as Char
data Things t = Things {thing :: t, quantity :: Int}
instance (Show t) => Show (Things t)
where
show t = if quantity t == 1 then get t else get t ++ "s"
where
get = filter (not . (`elem` "\"")) . show . thing
makeSentence :: (Show t) => [Things t -> String] -> t -> Int -> String
@newlawrence
newlawrence / wallis.hs
Last active February 19, 2017 23:32
Computes the product of the first n elements of the Wallis succession
import Data.Ratio
import Text.Read
import System.Environment
wallis_succession :: [Rational]
wallis_succession = merge odds evens
where
odds = [n % (n - 1) | n <- [2, 4..]]
evens = [n % (n + 1) | n <- [2, 4..]]
merge (x:xs) (y:ys) = x : y : merge xs ys
@newlawrence
newlawrence / vagenc.c
Last active January 26, 2024 16:40
A "not too much elegant" (and the only) way to get a templated, variadic and type-safe function in pure C
#include <stdio.h>
#define COUNT(...) (sizeof((int[]){ __VA_ARGS__ })/sizeof(int))
#define __eval(x0, x1, x2, x3, ...) _Generic((x0), \
void*: _Generic((x1), int: _evali, double: _evald), \
int: _evali, \
double: _evald \
)( \
COUNT(__VA_ARGS__) - _Generic((x0), void *: 1, default: 0), \
@newlawrence
newlawrence / macos_tricks.sh
Last active January 3, 2018 13:02
Some macOS tricks - just add to .bash_profile
# Customize prompt
export PROMPT_COMMAND="BRANCH=\
\"\$(git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/(\1)/')\""
export PS1="\[\033[36m\]\u\[\033[m\]@\[\033[32m\]"\
"\h:\[\033[33;1m\]\w\[\033[m\]\[\033[0;36m\]\${BRANCH}\[\033[0m\]\$ "
# Customize command line
export CLICOLOR=1
export LSCOLORS=ExFxBxDxCxegedabagacad
alias ls="ls -GFh"
@newlawrence
newlawrence / .vimrc
Last active January 3, 2018 10:57
My vimrc settings
syntax on
filetype indent off
set backspace=indent,eol,start
set tabstop=4 softtabstop=4 shiftwidth=4 expandtab
let g:netrw_banner = 0
let g:netrw_liststyle = 3
let g:netrw_browse_split = 4
let g:netrw_altv = 1
@newlawrence
newlawrence / join.cpp
Last active July 12, 2018 21:57
Performant C++17 implementation of Python's join function
#include <string_view>
#include <string>
#include <tuple>
class Joint {
std::string _j;
auto& _concat(std::string& s, std::string_view sv) { return s += sv; }
template<typename... Args>
@newlawrence
newlawrence / reduceop.cpp
Last active July 17, 2018 12:19
C++17 generator of Reduce-able Operators
#include <functional>
#include <tuple>
#include <type_traits>
template<typename T, typename U, typename V>
class ReduceOperator {
T _init;
U _apply;
V _chain;
@newlawrence
newlawrence / contiguous.cpp
Created November 20, 2018 19:22
Contiguous memory resource
#include <memory_resource>
template<typename T>
class contiguous_memory_resource : public std::pmr::memory_resource {
std::pmr::memory_resource* _upstream;
std::size_t _size;
void* _buffer;
void* _offset;
void* do_allocate(size_t bytes, size_t alignment) override {